2011-01-14 7 views
5

Tengo una aplicación que se presta para un modelo de evento/escucha. Se publican varios tipos diferentes de datos (eventos), y luego muchas cosas diferentes pueden o no necesitar actuar sobre esos datos (oyentes). No existe un orden específico en el que los oyentes tengan que pasar y cada oyente determinará si necesita o no actuar en el evento.Evento/Observador Impulsado por Ruby on Rails

¿Qué herramientas tienen las aplicaciones de Rails para realizar esta tarea? Espero no tener que hacerlo yo mismo

Editar (aunque, no puedo No es la gran cosa..): Modelo observador podría ser una mejor opción para este

+1

¿Estos oyentes van a ser procesos separados o son simples bloques de código que se pueden invocar durante la publicación de datos? – Nemo157

+0

Bloques de código probablemente simples el 80% del tiempo. Procesos separados serían el caso más raro, pero probablemente aún ocurriría. – Drew

Respuesta

4

Usted probablemente querrá enganchar en la clase Observer de ActiveRecord.

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

Con él, sus modelos se ejecutan lógica personalizada para varios eventos del ciclo de vida:

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

Si entiendo su intención correcta, todo lo que tiene que hacer es llamar a los métodos que representan la acción de tu oyente a un evento de esas devoluciones de llamada.

+0

Esto está muy cerca, pero no todo lo que se publicará es un ActiveRecord. ¿Cómo haría algo similar sin estar atada a ActiveRecord? – Drew

+0

Siempre puede traer la funcionalidad ActiveRecord a una clase que no sea ActiveRecord incluyendo ActiveRecord: Observer. Más información aquí: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ – Shaun

2

Es posible que desee utilizar ActiveSupport :: Notifications.instrument.

Es un puente de propósito general para desacoplar el envío de eventos al evento de reacción. Está orientado a la ejecución de todos los oyentes durante una única solicitud web, a diferencia de EventMachine, que está orientado a tener muchas cosas simultáneas sucediendo.

0

He creado una gema de rubíes responder exactamente a este caso de uso: event_dispatcher

Esta joya proporciona una implementación simple observador, lo que le permite suscribirse y escuchar para los eventos en su aplicación con una forma sencilla y eficaz.