コールバックとは
Railsガイドより
コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。
コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。
Active Recordのコールバックは、ModelなどのActive Recordオブジェクトが更新されたり削除されたりして状態が変わるときに、その前後でイベントが発生する。
そのイベントで任意の処理を行うことができる。
コールバックの登録方法
例)会員データが削除された時にログを出力する。
class Member < ApplicationRecord
略
after_destroy do
Rails.logger.info "Member is deleted: #{self.attributes}"
end
end
Memberが削除された時にafter_destroy
内の処理が、実行される。
種類
以下はActive Recordで利用可能なコールバック例。
before_はトリガーの前、around_はトリガーの前後、after_はトリガーの後の処理を定義できる。
before_validationなら、createとupdateで行われる検証処理の前に発生する。
コールバックポイント | create | update | destroy |
---|---|---|---|
before_validation | ○ | ○ | × |
after_validation | ○ | ○ | × |
before_save | ○ | ○ | × |
around_save | ○ | ○ | × |
after_save | ○ | ○ | × |
before_create | ○ | × | × |
around_create | ○ | × | × |
after_create | ○ | × | × |
before_update | ○ | ○ | × |
around_update | ○ | ○ | × |
after_update | ○ | ○ | × |
before_destroy | × | × | ○ |
around_destroy | × | × | ○ |
after_destroy | × | × | ○ |
その他の使ってみた例
開発中に削除処理が失敗した時の挙動を確認したい場合があったので、以下のようにすると失敗させることができた。
class Member < ApplicationRecord
略
before_destroy { throw(:abort) }
end
throw(:abort)
を書くことでコールバックの処理を意図的に停止させることができる。
コールバックで気をつけるべきこと
- コールバックはmodelで設定されるので、controllerからロジックが見えず、開発者が予期しない処理が実行されることになりかねない。
- コールバックを多用したり複雑な処理を行うとファットモデルになる。