2011-01-14 13 views
5

Mam aplikację, która nadaje się do modelu zdarzenia/słuchacza. Kilka różnych rodzajów danych zostaje opublikowanych (zdarzenie), wtedy wiele różnych rzeczy może, ale nie musi działać na tych danych (detektory). Nie ma określonej kolejności, w której słuchacze muszą się znaleźć, a każdy słuchacz decyduje, czy musi działać w tym wydarzeniu.Event/Observer Driven Ruby on Rails

Jakie narzędzia dla aplikacji Railsowych służą do realizacji tego zadania? Mam nadzieję, że nie musisz tego robić sam

Edit (choć mogę to nie takie wielkie rzeczy..): Obserwator wzór może być lepszym wyborem dla tego

+1

Czy te słuchacze będą oddzielnymi procesami, czy też są prostymi blokami kodu, które można wywołać podczas publikowania danych? – Nemo157

+0

Prawdopodobnie prosty kod blokuje 80% czasu. Oddzielne procesy byłyby rzadkim przypadkiem, ale prawdopodobnie doszłoby do skutku. – Drew

Odpowiedz

4

Prawdopodobnie będziesz chciał podłącz się do klasy ActiveRecord Observer.

http://api.rubyonrails.org/v3.2.13/classes/ActiveRecord/Observer.html

Dzięki niemu twoje modele można wykonać niestandardową logikę do kilku zdarzeń cyklu życia:

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

Jeśli rozumiem intencję prawidłowo, wszystko trzeba zrobić, to zadzwonić do metody które reprezentują akcję twojego słuchacza do zdarzenia z tych wywołań zwrotnych.

+0

Jest to bardzo blisko, ale nie wszystko, co zostanie opublikowane, to ActiveRecord. Jak mógłbym zrobić coś podobnego bez powiązania z ActiveRecord? – Drew

+0

Zawsze można wprowadzić funkcjonalność ActiveRecord do klasy innej niż ActiveRecord, włączając w to ActiveRecord: Observer. Więcej informacji tutaj: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ – Shaun

2

Możesz użyć ActiveSupport :: Notifications.instrument.

Jest to most ogólnego zastosowania do rozłączania wysyłania zdarzeń do reagowania na zdarzenia. Jest nastawiony na wykonywanie wszystkich słuchaczy podczas pojedynczego żądania internetowego, w przeciwieństwie do EventMachine, który jest nastawiony na wiele równoległych zdarzeń.

0

Stworzyłem ruby ​​gem reaguje dokładnie tym przypadku zastosowanie: event_dispatcher

Ten gem zapewnia prostą implementację obserwatora, dzięki czemu można subskrybować i nasłuchiwać zdarzeń w aplikacji w prosty i skuteczny sposób.