Rails 一日一つメソッド (Day44) Active Record(2)コールバック
Rails 一日一つメソッド (Day44) Active Record(2)コールバック
1. Active Recordコールバック
- Active Record コールバックは、Rails モデルで発生する特定のイベントに自動的に実行されるメソッドで、 これにより、モデルのライフサイクル中に特定のタスクを実行でる。 データの保存、更新、削除などの作業の「前」、「後」に特定のロジックを実行してコードを再利用し、重複を防止することができ、モデルの動作を細かく制御することができる。
class User < ApplicationRecord
after_create -> { puts "始めまして!" }
end
irb> @user = User.create
始めまして!
2. コールバックの概要
- コールバックは、オブジェクトのライフルサイクル期間における特定の瞬間に呼び出されるメソッドのことで、コールバックで、Active Recordオブジェクトが作成、更新、保存、削除、検証、DataBaseから読み込み、などのイベント発生時に常に実行されるコードを書けるようになる
3. コールバックの登録
- コールバックをModelに登録し、マクロのようなスタイルのClassメソッドを使う。
3-1) 登録1
class User < ApplicationRecord
validates :login, :email, presence: true
before_validation :ensure_login_has_a_value
private
def ensure_login_has_a_value
if login.blank?
self.login = email unless email.blank?
end
end
end
before_valibationに ensure_login_has_a_valueメソッドを登録しvalidate検証前に login属性が空いている場合、email属性を使って値にする。
3-2) 登録2
class User < ApplicationRecord
validates :login, :email, presence: true
before_create do
self.name = login.capitalize if name.blank?
end
end
before_createにブロックを使って生成前に name属性が空いている場合、login属性を使って値にする。
3-3) 登録3
class User < ApplicationRecord
before_create ->(user) { user.name = user.login.capitalize if user.name.blank? }
end
ラムダ表現式を用いて before_createコールバックを定義し、ラムダ渡して生成前に name属性が空いている場合、login属性を使って値にする。
4. 利用可能なコールバック
4.1) オブジェクトの作成 (Object Creation)
before_validation | Objectの Validation検証が実行する「前」に呼び出され、Dataを処理したり検証する。 |
after_validation | Objectの Validation検証が実行する「後」で、呼び出され、検証の結果を持ってロジックを実行する |
before_save | Objectが保存される前に呼び出され、Dataを保存する前に、Dataを処理したり検証するためのロジックを行う。 |
after_save | Objectが保存される後に呼び出され、保存されたDataと関連がある作業を行う。 |
around_save | Objectが保存された「前、後」に呼び出され、オブジェクトを保存することに使われたトランザクションをラッピングし、特定のロジックを実行したり、操作する時に使う。 |
before_create | Objectが生成される前に呼び出され、Objectを生成する前に、前処理タスクを実行する。 |
after_create | Objectが生成される後に呼び出され、Objectと関連された作業を行う。 |
around_create | Objectが生成される「前、後」に呼び出され、Objectを生成することに使われた、トランザクションをラッピングする。 |
after_commit | トランザクションがCommitされた後、呼び出されたり rollbackされた後に呼び出され、追加作業を行う。 |
after_rollback |
4.2) オブジェクトの更新 (Object Update)
4.3) オブジェクトの削除 (Object Destruction)