2014-05-12 2 views
9

Я написал специальную аппаратуру в приложении Rails. Включить его в config/initializers/instrumentation.rb файл, например так:Rails reloading classes и 'был удален из дерева модулей, но по-прежнему активен!' ArgumentError

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, но что произойдет, если в следующем выпуске будет?

ответ

4

Первый подход выглядит чище -

Добавление путь, по которому может «FooBar :: ControllerRuntimeis определенный toconfig.autoload_one_paths`

Причины -

1) Если вы действительно хотите сделать некоторые патчи для обезьян в файле lib/extensions.rb, это может потребоваться вручную:

in co nfig/Инициализаторы/require.rb:

требуют "# {Rails.root}/Lib/расширений"

2) Следует соответствующие соглашения об именах, как вы должны будете перечислить вниз класс и модуль.

Хотя я бы не предлагал автозагрузку для производственного приложения, но если это последний вариант, вы можете, конечно, попробовать его.

Хорошо читайте здесь на этих же страницах - http://www.williambharding.com/blog/technology/rails-3-autoload-modules-and-classes-in-production/