2015-02-05 7 views
7

Mam słuchaczy w katalogu app/listeners.automatycznie ładuj nowych odbiorców na każde żądanie.

Mam też /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) 

można jakoś wymusić Rails przeładować słuchaczy na każde żądanie?

Odpowiedz

13

Można spróbować owijania subskrybuje w to_prepare bloku, coś jak:

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

to_prepare jest wywoływana raz w produkcji i przed każdą prośbę w środowisku programistycznym.

Jeśli subskrybujesz w więcej niż jednym inicjalizatorze, możesz umieścić Wisper.clear w inicjatorze o nazwie "01_clear_subscribers", aby upewnić się, że subskrybenci są rozliczani tylko raz.

Nawiasem mówiąc, nie trzeba zastępować setup, aby skonfigurować nadawcę, wystarczy wykonać Wisper.configure do |config|.

+1

Działa również w trybie TDD/BDD: Wisper.clear, chyba że Rails.env.production? – Boti

+5

Warto zauważyć, że rozwiązało to problem, który miałem, gdy zmiany któregokolwiek z mojego kodu Railsowego spowodowały, że "kopia X została usunięta z drzewa modułów, ale nadal jest aktywna!" błąd. Mamy nadzieję, że ten komentarz będzie oznaczał, że ludzie znajdą to rozwiązanie szybciej niż ja! –

+0

Wpadłem na ten problem w moim projekcie Rails i zdecydowałem się użyć 'before_initialize' zamiast' to_prepare', aby upewnić się, że wyczyść działa tylko raz podczas procesu inicjalizacji dla wszystkich środowisk. – ecbrodie

Powiązane problemy