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

vul*_*ule 5 ruby-on-rails callback observer-pattern

我对一个问题感到绝望.

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

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

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

谢谢

小智 17

如果有人在寻找,这是一个解决方案:

在你的模型中调用:

notify_observers(:after_my_custom_callback)
Run Code Online (Sandbox Code Playgroud)

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

def after_my_custom_callback(record)

 #do things
end
Run Code Online (Sandbox Code Playgroud)


Pio*_*ior 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
Run Code Online (Sandbox Code Playgroud)

它实际上在某种程度上涵盖了观察者的行为

<--更新-->

save、save! 或 destroy 调用的整个回调链在事务内运行。这包括 after_* 挂钩。如果一切顺利,一旦链完成,就会执行 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
Run Code Online (Sandbox Code Playgroud)

其中朋友是对象 => 有自己的观察者,历史是对象 => 有自己的观察者

它非常抽象,但是如果没有您的代码,我不知道如何给出一些建设性的示例,而且 after_validation 也不是保存我认为的任何内容的最佳位置。

对我来说,notify_observer 听起来就像 hack :-)