コールバックとオブザーバーの違い
ruby on rails 3
railsにはコールバックとオブザーバーのふたつの考え方がある。
これらは、モデルにおいて新規登録/更新/削除のタイミングで呼び出される処理を記述するもの。
コールバックはモデルに密接した処理を記載するのに対し、オブザーバーはモデルに密接していない(依存していない)処理を記載する。オブザーバーは、モデルを監視をするクラスとして独立しているイメージ。これにより、再利用性の向上、モデルに依存していない明確な意識付けができる。
コールバック
モデルAにデータを追加する時にログを書き込む例。
class A < ActiveRecord::Base after_create do |b| logger.info('created:' + b.inspect) end end
オブザーバー
モデルAにデータを追加するときにメールを送信する例。
- railsコマンド
rails generate observer A
でオブザーバーを作成する。 - 生成されたオブザーバーファイル
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