Question

In Rails, the closest I've seen to Django Signals are Observers. The problem with them is that they're restricted to triggering callbacks on hardcoded events related to a model's lifecycle.

Django signals can be created anywhere, triggered anywhere and handled anywhere. The model lifecycle callbacks are just regular signals that happen to come built-in and that are triggered by the ORM.

Does anyone know of a similarly general solution for Rails? It could be some generic Ruby library, not tied to Rails, which would be even better.


Edit: Observer is the closest thing, but it's not what I'm looking for. It's a one-to-many solution. Anyone can listen, but only the originating object can post. I'd like something where you declare a signal, and anyone can trigger it as well as handle it. Also, I don't like the fact that the Ruby Observer dictates that the handler have an #update method. I'd like to be able to pass any method reference with the appropriate signature.

I could use the Ruby Observer to implement my own such broker, but I'm trying to learn if someone already did it.

Was it helpful?

Solution

I think a closer equivalent than Rails' Observer is the standard Ruby Observable module. It lets you add a list of observers to an object and the object can then send notifications to the observers when it changes.

OTHER TIPS

What about the 'wisper' gem? https://github.com/krisleech/wisper

Wisper is a Ruby library for decoupling and managing the dependencies of your Ruby objects using Pub/Sub.

It is commonly used as an alternative to ActiveRecord callbacks and Observers to reduce coupling between data and domain layers.

Perhaps acts_as_state machine will help. Most of this functionality has recently been baked into Rails edge.

I just implemented a gem with that. https://github.com/pkoch/django_signal/

Ruby gem 'watchable' is the most appropriate choice https://github.com/jbarnette/watchable

It has a syntax that is very familiar to Django's (and other frameworks, like Qt and many others).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top