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::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
. Right know ActionController::Railtie
не имеет определенного to_prepare
, но что произойдет, если в следующем выпуске он будет иметь?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/