我在Rails应用程序中编写了自定义检测。我在config/initializers/instrumentation.rb
文件中启用它,如下所示:
ActiveSupport.on_load(:action_controller) do
include FooBar::ControllerRuntime
end
但这导致我犯错误A copy of FooBar::ControllerRuntime has been removed from the module tree but is still active!
。我弄清楚我可以通过两种方式解决它:
is defined to
config.autoload_one_paths` :to_prepare
ActionController::Railtie
回调
第二个解决方案如下:
config.to_prepare do
ActionController.include FooBar::ControllerRuntime
end
这个长篇介绍会引出一个问题:哪种方式更好?首先,我禁止重新加载与FooBar::ControllerRuntime
位于同一路径的类。第二,我觉得与ActionController::Railtie
混淆不太好。正确的知道ActionController::Railtie
没有定义to_prepare
但是如果在下一个版本中它将会发生什么?
答案 0 :(得分:4)
第一种方法看起来更清洁 -
添加可以定义FooBar :: ControllerRuntime的路径 toconfig.autoload_one_paths`
原因 -
1)如果你真的想在lib / extensions.rb等文件中做一些猴子补丁,你可以手动要求它:
在config / initializers / require.rb中:
要求"#{Rails.root} / lib / extensions"
2)遵循正确的命名约定,因为您必须列出类和模块。
我不建议自动加载生产应用程序,但如果它是最后一个选项,那么你肯定可以尝试一下。
这里好好阅读 - http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/