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)
观察者使用标准 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 :-)