我应该把我的中间件文件放在Rails 5.1的哪个位置?

19

之前,我的中间件存放在lib/middleware/my_middle_ware.rb下。

然而,在这样做时,

config.middleware.use MyMiddleWare

我收到了

NameError: uninitialized constant

Rails 在哪里寻找中间件?

5个回答

11

看起来Rails没有寻找它。

我必须按照以下步骤才能使它正常工作。

Dir["./lib/middleware/*.rb"].each do |file|
  require file
end

3
我采用了与您相同的修复方法,但似乎框架本应加载这些内容。也许这是一个错误? - Jay Prall
@JayP。我同意。这是一个bug吗?我在Rails 5.2上,这种情况正在发生。惊讶的是,没有像“models”、“controllers”、“views”、“mailers”等那样的标准自动加载目录来加载“middleware”。 - Joshua Pinter

5
创建一个名为app/middlewares的文件夹,并在其中创建中间件文件。
但是,即使我将其添加到Rails v5.2.2中的加载路径中,app/middlewares文件夹仍然无法加载。
config.autoload_paths << "#{Rails.root}/app/middlewares"
config.eager_load_paths << "#{Rails.root}/app/middlewares"

因此,您可以按如下方式明确使用require,将以下行添加到application.rb中。
require_relative '../app/middlewares/my_middleware'

并加载中间件:

config.middleware.use MyMiddleware

并且调用rake middleware命令来查看中间件堆栈。


1

我相信你想把你的中间件添加到config/application.rb或者config/environments文件中。

config.middleware.use MyMiddleWare

这应该可以实现,并将MyMiddleWare附加到中间件堆栈的底部。

1
即使在加载应用程序/中间件内容之前调用'config.middleware.use',我认为您会收到“未初始化的常量错误”。以下内容应该可以解决问题。
config.middleware.use "MyMiddleWare"

如果上述方法无效,以下任一方法可能不可行。
Is MyMiddleWare in app/middleware/my_middle_ware.rb ?

Is MyMiddleWare in lib/my_middle_ware.rb ?

6
我认为在 Rails 5 之前,使用字符串指定中间件类是有效的。参见:https://github.com/rails/rails/issues/25525 - turboladen

0

将中间件作为字符串替换在config/application.rb中的位置,改为作为常量放在config/environment/{environment}中,这个方法解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接