使用rails3中的观察者进行自定义回调

时间:2011-02-21 11:20:26

标签: ruby-on-rails callback observer-pattern

我非常渴望遇到一个问题。

我想注册自定义回调:after_something 然后将该回调用于观察者。

我已尝试使用define_callbacks,set_callbacks但观察者永远不会触发该回调。

我知道我可以使用AR回调,但我更喜欢在某些情况下使用我自己的回调。

由于

3 个答案:

答案 0 :(得分:17)

如果有人在寻找:

,这是一个解决方案 你的模型中的

称之为:

notify_observers(:after_my_custom_callback)

在你的观察者中只需定义方法:

def after_my_custom_callback(record)

 #do things
end

答案 1 :(得分:1)

观察者使用标准的AR回调,因此它不会触发你的默认回调。

我认为发明新的回调(以及AR的monkeypatch默认行为)可能你应该使用AR。很难说你想要什么。你能举一些用例吗?

尝试类似

的东西
before_save MyCallbacks.new, :if => :some_condiditons_meet?

class MyCallbacks
  def before_save(object)
    sophistcated_use(object) if object.valid?
    damn_have_it?
  end
end

它实际上涵盖了某个级别的观察者行为

< - 更新 - >

save,save!或destroy调用的整个回调链在事务中运行。这包括after_ * hooks。如果一切顺利,一旦链完成就会执行COMMIT。

我认为单个观察者的整个想法不是最好的解决方案。在更多依赖关系到来后,您的逻辑将变得非常复杂。定义自己的事务包装器很好,但你真的需要它吗?也许你可以重新安排模型来实现它,而无需编写自己的交易案例。

例如

class Friendship < ActiveRecord::Base
  belongs_to :user
  has_many :users, :through => :groups

  after_validation :save_my_records

  def save_my_records
    user.friend.history.save
    user.history.save
  end

end

朋友是对象=&gt;有自己的观察员 其中history是object =&gt;有自己的观察员

这是非常抽象的,但是如果没有你的代码,我也不知道如何提供一些建设性的例子,而且after_validation不是保存任何我认为的最好的地方。

还有notify_observer听起来像黑客一样: - )

答案 2 :(得分:1)

感谢Alex的回答,我可以通过定义一个应该被调用而不是define_model_callbacks_for_observers的{​​{1}}方法来解决这个问题(你可能想把它放到一个模块中):

define_model_callbacks