Rails重新加载类和'已从模块树中删除但仍处于活动状态!'引发ArgumentError

时间:2014-05-12 08:46:18

标签: ruby-on-rails instrumentation ruby-on-rails-4.1

我在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!。我弄清楚我可以通过两种方式解决它:

  • 添加路径'FooBar :: ControllerRuntime 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但是如果在下一个版本中它将会发生什么?

1 个答案:

答案 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/