2009-08-08 5 views
3

Dans Rails, le plus proche que j'ai vu à Django Signals sont Observers. Le problème avec eux est qu'ils sont limités à déclencher des rappels sur des événements codés en dur liés au cycle de vie d'un modèle.Equivalent de Signaux Django pour Rails?

Les signaux Django peuvent être créés n'importe où, déclenchés n'importe où et gérés n'importe où. Les rappels du cycle de vie du modèle ne sont que des signaux réguliers qui viennent à être intégrés et qui sont déclenchés par l'ORM.

Quelqu'un connaît-il une solution similaire pour Rails? Ce pourrait être une bibliothèque Ruby générique, non liée à Rails, ce qui serait encore mieux.


Modifier: Observer est la chose la plus proche, mais ce n'est pas ce que je cherche. C'est une solution un-à-plusieurs. Tout le monde peut écouter, mais seul l'objet d'origine peut poster. Je voudrais quelque chose où vous déclarez un signal, et n'importe qui peut le déclencher ainsi que le gérer. Aussi, je n'aime pas le fait que le Ruby Observer dicte que le gestionnaire a une méthode #update. J'aimerais pouvoir passer n'importe quelle référence de méthode avec la signature appropriée.

Je pourrais utiliser le Ruby Observer pour implémenter mon propre courtier, mais j'essaie d'apprendre si quelqu'un l'a déjà fait.

+0

C'est juste le modèle Observer, qui fait partie des libs standards Ruby, plutôt que Rails. Rails Les observateurs sont un cas spécial, convention-over-configuration, autant que je sache. –

Répondre

3

Je pense qu'un équivalent plus proche que l'observateur de Rails est le standard Ruby Observable module. Il vous permet d'ajouter une liste d'observateurs à un objet et l'objet peut ensuite envoyer des notifications aux observateurs lorsqu'il change.

0

Peut-être que la machine acts_as_state vous aidera. La plupart de ces fonctionnalités ont été récemment cuites dans Rails Edge.

1

Qu'en est-il de la gemme «wisper»? https://github.com/krisleech/wisper

Wisper est une bibliothèque Ruby pour le découplage et la gestion des dépendances de vos objets Ruby utilisant Pub/Sub.

Il est généralement utilisé comme alternative aux rappels ActiveRecord et pour réduire le couplage entre les couches de données et de domaine.