The usefulness of ActiveRecord::Observer is limited by the fact that the return value of any callback methods in observers is thrown away.
def before_destroy(model)
false # thrown away, fails to stop the destroy
end
The return value is being thrown away in the notify_observers method in observer.rb in the Ruby Standard Library. As a result it is impossible for an Observer to prevent an action from proceeding, except by raising an exception. This in turn requires additional code in the controller to rescue and deal with the exception; this is undesireable because it leads to clutter and lack of consistency (some controller actions expecting observer-thrown exceptions and other controller actions not).
The other workaround is to simply not use the Observer model at all and put the code into your model classes directly, but this is not ideal because it can lead the boundary between model and controller being blurred when the model starts taking on too many controller-like responsibilities.
The desired solution is to remove ActiveRecord::Observer's dependency on observer.rb and implement the pattern in a way that doesn't throw away the callback return values and therefore provides parity between methods in observers and the same methods implemented in models.