与 wisper
相比,使用 rails-observers
gem有什么好处?
乍一看,它们看起来都非常相似,但是社区似乎更愿意对Wisper给予支持(基于GH明星,提交和发布)。它们之间有什么显着差异吗?
最佳答案
Rails观察者遭受与ActiveRecord回调相同的问题,主要是无法将其关闭。使用ActiveRecord回调,您可以将模型永久耦合到回调中引用的对象,并且回调中发生的任何副作用总是在所有情况下发生。使用观察者只会真正解决问题。
如果我们想在我们今天不希望看到的上下文中使用我们的模型,而又不想发生观察者回调该怎么办?
引用:http://samuelmullen.com/2013/05/the-problem-with-rails-callbacks/
Wisper(免责声明,此处为作者)允许发布者(例如模型)在发生重大事件时广播事件。监听器在运行时被订阅到发布者。发布者和订阅者彼此一无所知。彼此之间没有硬性依赖,它们仅依赖于事件。
我们的系统必然具有对象之间的依赖关系,它们需要进行通信。但是,我们希望这种依赖关系尽可能地轻便,以便将来可以在当前当前无法预见的不同情况下使用对象。另请参见Connascence以获取轻/硬依赖关系的示例。
使用Wisper,您可以在不同的上下文中选择是否订阅监听器。
例如,在 Controller 中,我可能会订阅一些监听器,但是在单元测试中,我可能希望测试模型隔离,而不会发生这些副作用。另一个示例可能是瑞克任务,我想保存模型,但不希望发生某些副作用。或者是我不希望/在其他情况下不应该发生的事情的管理员 Controller 。
最后,Wisper具有built-in support,用于异步广播事件,观察者则不这样做,它们始终是同步的。