2015-02-05 3 views
7

У меня есть прослушиватели прослушиваний в каталоге приложений/слушателей.перезагрузите прослушиватели wisper автоматически при каждом запросе

У меня также есть /config/initializers/wisper.rb

module Wisper 
    def self.setup 
    configure do |config| 
     config.broadcaster(:default, Broadcasters::LoggerBroadcaster.new(Rails.logger, Broadcasters::SendBroadcaster.new)) 
    end 
    end 
end 

Wisper.setup 

Wisper.subscribe(ProjectListener.new) 
Wisper.subscribe(FeedListener.new) 

Могу ли я каким-то образом заставить Rails перезагрузить Слушателей на каждом запросе?

ответ

13

Вы можете попробовать обертывание подписывается в to_prepare блоке, что-то вроде:

Rails.application.config.to_prepare do 
    Wisper.clear if Rails.env.development? 
    Wisper.subscribe(ProjectListener.new) 
    Wisper.subscribe(FeedListener.new) 
end 

to_prepare вызывается один раз в производстве и перед каждым запросом в среде разработки.

Если вы подписались на более чем один инициализатор, вы можете поместить Wisper.clear в инициализатор с именем '01_clear_subscribers`, чтобы гарантировать, что подписчики будут удалены только один раз.

Кстати, вам не нужно переопределять setup для настройки вещателя, просто сделайте Wisper.configure do |config|.

+1

Это также работает в режиме TDD/BDD: Wisper.clear, если Rails.env.production? – Boti

+5

Стоит отметить, что это устранило проблему, с которой я столкнулся, когда изменения в любом из моего кода Rails привели к тому, что «Копия X была удалена из дерева модулей, но все еще активна!» ошибка. Надеюсь, этот комментарий будет означать, что люди найдут это решение быстрее, чем я! –

+0

Я столкнулся с этой проблемой в своем проекте Rails, и я решил использовать 'before_initialize' вместо' to_prepare', чтобы гарантировать, что clear запускается только один раз во время процесса инициализации для всех сред. – ecbrodie

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