ゲラウト!

困難に立ち向かい、ただひたすらに遊べ!

コールバックとオブザーバーの違い

ruby on rails 3

railsにはコールバックとオブザーバーのふたつの考え方がある。
これらは、モデルにおいて新規登録/更新/削除のタイミングで呼び出される処理を記述するもの。

コールバックはモデルに密接した処理を記載するのに対し、オブザーバーはモデルに密接していない(依存していない)処理を記載する。オブザーバーは、モデルを監視をするクラスとして独立しているイメージ。これにより、再利用性の向上、モデルに依存していない明確な意識付けができる。

コールバック

モデルAにデータを追加する時にログを書き込む例。

class A < ActiveRecord::Base
  after_create do |b|
    logger.info('created:' + b.inspect)
  end
end

オブザーバー

モデルAにデータを追加するときにメールを送信する例。

  1. railsコマンドrails generate observer Aでオブザーバーを作成する。
  2. 生成されたオブザーバーファイルA_observer.rbに以下を追記する。
  class AObserver < ActiveRecord::Base
    def after_create(b)
      NoticeMailer.sendmail_A(b).deliver
    end
  end

3.設定ファイルconfig/environments/development.rbに作成したオブザーバーを登録する。

config.active_record.observers = :book_observer

※ モデルとの連結は、ファイル名からクラスを特定して勝手に行ってくれる。

複数モデル用のオブザーバーも作成可能

オブザーバー先頭に以下の記述を加えれば、複数のモデルにて使用できるようになる。

observe :モデルA, :モデルB

プログラム上で処理対象のモデルを識別したい場合は、以下の記述を行う。

def after_create(b)
  if b.is_a?(モデルA)
    # モデルAの処理
  else
    # モデルBの処理
  end
end