ActiveModel::Callbacks
ActiveModel::Callbacksを使えばafter_saveなどのコールバックを手軽に実装できる。
まずActiveRecord::Baseのような抽象クラスを次のように定義する。
class AbstractModel extend ActiveModel::Callbacks define_model_callbacks :save def save _run_save_callbacks do # 具体的なsaveメソッドの内容 # この前後にbefore_saveとafter_save、そしてaround_saveが呼ばれる end end end
重要なのはsaveメソッドの内容を_run_save_callbacks
でラップすること。これはコールバックを利用するメソッドに応じて動的に生成され、createメソッドであれば_run_create_callbacksを利用する。
そしてコールバックを利用したい具象クラスでは次のようにする。
class SomeModel < AbstractModel before_save :foo protected def foo # before_saveで実行したい内容 end end
これ以外にもbefore_saveにブロックを渡したり、before_saveをインスタンスメソッドとして定義しているオブジェクトを渡したりすることで処理を実装できる。
define_model_callbacks
では複数のコールバック対象のメソッドを指定することができる。
define_model_callbacks :save, :create
:only
オプションを使うことで例えばafter_*
だけに制限することもできる。
define_model_callbacks :save, :only => :after