ruby-on-rails - 观察者与回调

标签 ruby-on-rails callback observer-pattern

我考虑过使用观察者或回调。
什么时候应该使用观察者?

F.e.您可以执行以下操作:

# User-model
class User << AR
  after_create :send_greeting!

  def send_greeting!
    UserNotifier.deliver_greeting_message(self)
  end

end

#observer
class UserNotifier << AR
  def greeting_message(user)
  ...
  end
end

或者你可以创建一个观察者并让它观察用户何时被创建......

你推荐什么?

最佳答案

要记住的一个非常重要的区别与 Milan Novota 的回答有关,即 ActiveRecord 上的回调能够取消被调用的操作和所有后​​续回调,而观察者则不能。

class Model < ActiveRecord::Base
  before_update :disallow_bob

  def disallow_bob
  return false if model.name == "bob"
  end
end

class ModelObserver < ActiveRecord::Observer
  def before_update(model)
    return false if model.name == "mary"
  end
end

m = Model.create(:name => "whatever")

m.update_attributes(:name => "bob")
=> false -- name will still be "whatever" in database

m.update_attributes(:name => "mary")
=> true -- name will be "mary" in database

观察者只能观察,不能干预。

关于ruby-on-rails - 观察者与回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1531514/

相关文章:

ruby-on-rails - 如何在 Rails 环境中将参数传递给 Rake 任务?

ruby-on-rails - 在 cancan、ability.rb 中使用范围

ruby-on-rails - 动态页面的 Rails 嵌套路由

ruby-on-rails - rails : how to require files from lib folder in order to use them in controllers?

javascript - 如何在回调中访问正确的“this”?

javascript - 如何在 JavaScript 中向具有多个异步调用的函数添加回调?

javascript - nodemailer sendMail 回调函数从未运行

java - Android:looper/handler vs. Java Observer?

angular - 适当的可观察管理

ios - RX Swift - API 的并行执行