2011-01-14 5 views
5

У меня есть приложение, которое поддается модели события/слушателя. Публикуются несколько различных видов данных (событие), тогда многие разные вещи могут или не могут действовать на эти данные (слушатели). Нет конкретного порядка, в котором должны случиться слушатели, и каждый слушатель определит, нужно ли ему действовать на мероприятие.Event/Observer Driven Ruby on Rails

Какие инструменты для Rails-приложений существуют для выполнения этой задачи? Я надеюсь, что не придется делать это сам

Edit (хотя, я могу это не так уж много..): Паттерн наблюдатель может быть лучшим выбором для этого

+1

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

+0

Вероятно, простые кодовые блоки в 80% случаев. Отдельные процессы были бы более редким случаем, но, вероятно, это могло произойти. – Drew

ответ

4

Вы, вероятно, хотите подключайтесь к классу ActiveRecord Observer.

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

С ним ваши модели могут выполнять пользовательскую логику для нескольких событий жизненного цикла:

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

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

+0

Это очень близко, но не все, что будет опубликовано, - это ActiveRecord. Как бы я сделал что-то подобное, не привязавшись к ActiveRecord? – Drew

+0

Вы всегда можете использовать функциональность ActiveRecord в классе без ActiveRecord, включив ActiveRecord: Observer. Дополнительная информация здесь: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ – Shaun

2

Вы можете использовать ActiveSupport :: Notifications.instrument.

Это универсальный мост для развязывания событий, отправляемых на событие реагирования. Он ориентирован на выполнение всех слушателей во время одного веб-запроса, в отличие от EventMachine, который ориентирован на то, чтобы иметь много одновременных вещей.

0

Я создал рубиновый камень отвечающий именно к этому прецеденту: event_dispatcher

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