У меня есть приложение, в котором я динамически создаю классы контроллера в методе ActionDispatch::Routing::RouteSet::Dispatcher.controller_reference
, когда они не существуют с помощью Object.const_set
и Class.new
.Reload Dynamically Created Controller in Rails
Это нормально работает до тех пор, пока я не изменю контроллер, из-за которого этот динамически созданный контроллер не основан (это происходит LOT, поскольку я постоянно вношу изменения в контроллер).
Это бросает следующее исключение:
ArgumentError
A copy of Base::FooController has been removed from the module tree but is still active!
У меня есть Base::FooController
, который является родительским и я создаю контроллер на лету под названием Bar::FooController
.
Данное исключение составляет ActiveSupport::Dependencies.load_missing_constant
. Есть ли способ перезагрузить/воссоздать этот класс и избежать исключения?
ActiveSupport/Библиотека/active_support/dependencies.rb
def load_missing_constant(from_mod, const_name)
log_call from_mod, const_name
# I want to do a check here and recreate the controllers that are needed....
unless qualified_const_defined?(from_mod.name) && Inflector.constantize(from_mod.name).equal?(from_mod)
raise ArgumentError, "A copy of #{from_mod} has been removed from the module tree but is still active!"
end
...
вы знаете, какие изменения, что модификация делает ли? если это так, вы можете сделать это во время создания. –
Ну, я постоянно обновляю контроллер при разработке приложения, поэтому мне просто нужно его перезагрузить, а не бросать это исключение. –
вы waaaayyyy с проторенной дорожкой здесь. Автоматическая загрузка Rails не сработает для вас - вам нужно будет остановить и запустить сервер rails разработки с каждым изменением вашего динамически созданного контроллера. –