2013-05-28 4 views
0

У меня есть приложение, в котором я динамически создаю классы контроллера в методе 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 

    ... 
+0

вы знаете, какие изменения, что модификация делает ли? если это так, вы можете сделать это во время создания. –

+0

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

+0

вы waaaayyyy с проторенной дорожкой здесь. Автоматическая загрузка Rails не сработает для вас - вам нужно будет остановить и запустить сервер rails разработки с каждым изменением вашего динамически созданного контроллера. –

ответ

0

Попробуйте это свойство найдено в config/environments/development.rb & config/environments/production.rb:

config.cache_classes = истинный

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

Также обратите внимание на порядок инициализации в № 5 ниже (обратите внимание на синим цветом комментария).

http://guides.rubyonrails.org/configuring.html

+0

В настоящее время это значение установлено в' false', потому что я не хочу кэшировать классы. Мне нужно, чтобы они были перезагружены/воссозданы в каждом запросе. –