Rails reloading classes and ' был удален из дерева модулей, но все еще активен!- ArgumentError


Я написал пользовательские инструменты в своем приложении 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!. Я понял, что могу решить ее двумя способами:
  • добавление пути, где may ' FooBar::ControllerRuntimeis defined toconfig.autoload_one_paths '
  • определение :to_prepare обратного вызова в ActionController::Railtie

Второе решение выглядит так:

config.to_prepare do
  ActionController.include FooBar::ControllerRuntime
end
Это длинное введение приводит к вопросу: какой путь лучше? С сначала я отключаю перезагрузку классов, которые лежат на том же пути, что и мой FooBar::ControllerRuntime. Со вторым я не чувствую, что это хорошо, чтобы связываться с ActionController::Railtie. Right know ActionController::Railtie не имеет определенного to_prepare, но что произойдет, если в следующем выпуске он будет иметь?
1 9

1 ответ:

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

При добавлении путь, по которому может фрагментик::ControllerRuntimeis определенными токонфиг.autoload_one_paths '

Причины -

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

В config / initializers / require.РБ:

Require "#{Rails.root} / lib / extensions "

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

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

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