2016-12-06 1 views
1

Я пытаюсь расширить модель от двигателя 1 с заботой от двигателя 2 с помощью инициализатора приложения, но я получаю какое-то странное поведение, вот что у меня есть:Расширение моделей двигателей Rails 4 с опасениями

Концерн

module Engine2 
    module Concerns 
    module MyConcern 

     extend ActiveSupport::Concern 

     included do 
     puts "Concern included!" 
     end 

     def jump 
     puts 'Jumping!!!!' 
     end 
    end 
    end 
end 

Initializer

require 'engine2/my_concern' 

module Engine1 
    class Member 
    include Engine2::Concerns::MyConcern 
    end 
end 

При загрузке вверх Applic ция, я вижу, как ожидают Concern included! сообщений в консоли, а Member класса может вызвать метод jump, но как только я изменить любой код в хосте-приложении, которое я получаю следующее сообщение об ошибке:

NoMethodError (undefined method 'jump' for #<Engine1::Member:0x007fe7533b4f10>)

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

Есть ли лучшее место, где я должен выполнить открытие класса, чтобы включить проблему вместо инициализатора?

ответ

0

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

Я решил это, переместив код инициализатора в блок to_prepare в application.rb.

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

Смежные вопросы