35

オブザーバーまたはコールバックを使用することを考えました。何をいつオブザーバーを使用する必要がありますか?

Fe あなたは次のことができます:

# 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

または、オブザーバーを作成して、ユーザーが作成されたときにそれを監視することもできます...

あなたは何をお勧めしますか?

4

3 に答える 3

45

Milan Novota の回答に関連する、心に留めておくべき非常に重要な違いの 1 つは、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

オブザーバーは観察するだけで、介入することはできません。

于 2011-02-04T00:49:11.510 に答える
29

オブザーバーを分離または責任の分散の手段として使用できます。基本的な意味では、モデル コードが乱雑になりすぎた場合は、不要な動作にオブザーバーを使用することを検討し始めます。オブザーバーの真の力 (少なくとも私が見ている限り) は、モデルと、他のすべて (または一部) のクラスによって機能が使用される他のサブシステムとの間の接続ポイントとして機能する能力にあります。アプリケーションに IM 通知を追加することにしたとしましょう。たとえば、システム内の一部 (またはすべて) のモデルの CRUD アクションの一部 (またはすべて) について通知を受け取りたいとします。この場合、オブザーバーを使用するのが理想的です。通知サブシステムはビジネス ロジックから完全に分離されたままになり、ビジネスに関係のない動作でモデルが乱雑になることはありません。

于 2009-10-07T16:00:28.293 に答える
12

コールバックはより短命です: 一度呼び出される関数に渡します。通常、コールバックを渡さないと関数を呼び出すことができないという点で、これは API の一部です。この概念は、関数の機能と密接に結びついています。通常、単一のコールバックのみを渡すことができます..

例: スレッドを実行し、スレッドの終了時に呼び出されるコールバックを提供します。

オブザーバーは寿命が長く、いつでも着脱できます。同じものに対して多くのオブザーバーが存在する可能性があり、それらのライフタイムが異なる可能性があります。

例: モデルからの値を UI に表示し、ユーザー入力からモデルを更新します。

于 2009-10-07T13:09:32.697 に答える