2011-01-14 2 views
5

J'ai une application qui se prête à un modèle événement/écouteur. Différents types de données sont publiés (événement), puis de nombreuses choses peuvent ou ne doivent pas agir sur ces données (auditeurs). Il n'y a pas d'ordre spécifique dans lequel les auditeurs doivent se produire et chaque auditeur déterminera s'il doit ou non agir sur l'événement.Ruby on Rails sur événement/observateur

Quels outils pour les applications Rails sont là pour accomplir cette tâche? J'espère ne pas avoir à faire moi-même

Edit (bien que, je peux ce n'est pas un gros problème..): Modèle d'observation pourrait être un meilleur choix pour cette

+1

Est-ce que ces écouteurs vont être des processus séparés ou sont-ils de simples blocs de code qui peuvent être appelés pendant la publication de données? – Nemo157

+0

Probablement simple bloque le code 80% du temps. Des processus séparés seraient le cas le plus rare mais se produiraient probablement probablement. – Drew

Répondre

4

Vous voudrez probablement accrocher dans la classe Observer d'ActiveRecord.

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

Avec lui, vos modèles peuvent exécuter une logique personnalisée pour plusieurs événements de cycle de vie:

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

Si je comprends bien votre intention, tout ce que vous aurez besoin de faire est d'appeler les méthodes qui représentent l'action de votre écouteur à un événement de ces rappels.

+0

Ceci est très proche, mais tout ce qui sera publié n'est pas un ActiveRecord. Comment ferais-je quelque chose de semblable sans être lié à ActiveRecord? – Drew

+0

Vous pouvez toujours activer la fonctionnalité ActiveRecord dans une classe non ActiveRecord en incluant ActiveRecord: Observer. Plus d'informations ici: http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ – Shaun

2

Vous pouvez utiliser ActiveSupport :: Notifications.instrument.

Il s'agit d'un pont polyvalent permettant de découpler l'envoi d'événement à la réaction d'événement. Il est orienté vers l'exécution de tous les écouteurs au cours d'une seule requête Web, contrairement à EventMachine, qui est destiné à avoir beaucoup de choses en même temps.

0

J'ai créé un petit bijou rubis répondant exactement à ce cas d'utilisation: event_dispatcher

Ce petit bijou offre une implémentation simple d'observateur, vous permettant de vous abonner et écouter les événements dans votre application un moyen simple et efficace.