3.5 コールバック
コールバックの登録
クラスメソッドを利用
class User < ApplicationRecord
before_create :generate_username
private
def generate_username
self.username = SecureRandom.hex(6)
end
end
ブロックを利用
class User < ApplicationRecord
before_create do
self.username = SecureRandom.hex(6)
end
end
オブジェクト作成時のコールバック
コールバック | タイミング |
---|---|
before_validation | バリデーションが行われる直前 |
after_validation | バリデーションの直後 |
before_save | オブジェクトがDBにINSERT、UPDATEされる直前 |
around_save | オブジェクトがDBにINSERT、UPDATEされる最中 |
before_create | オブジェクトがDBにINSERTされる直前 |
around_create | オブジェクトがDBでINSERTされている最中 |
after_create | オブジェクトがDBにINSERTされた直後 |
after_save | オブジェクトをDBにINSERT、UPDATEされた直後 |
オブジェクト更新時のコールバック
コールバック | タイミング |
---|---|
before_validation | バリデーションが行われる直前 |
after_validation | バリデーションの直後 |
before_save | オブジェクトがDBにINSERT、UPDATEされる直前 |
around_save | オブジェクトがDBにINSERT、UPDATEされる最中 |
before_update | オブジェクトがDBにUPDATEされる直前 |
around_update | オブジェクトがDBでUPDATEされている最中 |
after_update | オブジェクトがDBにUPDATEされた直後 |
after_save | オブジェクトをDBにINSERT、UPDATEされた直後 |
オブジェクト削除時のコールバック
コールバック | タイミング |
---|---|
before_destroy | destroyメソッドで削除される直前 |
around_destroy | オブジェクトがDBでDELETEされている最中 |
after_destroy | destroyメソッドで削除される直前 |
コールバックをスキップする
下のメソッドはコールバックが実行されないので、予期しないバグを引き起こす原因になるかもしれないので注意が必要です。
メソッド |
---|
decrement |
decrement_counter! |
delete |
delete_all |
increment |
increment_counter |
toggle |
touch |
update_column |
update_columns |
update_all |
update_counters |
条件付きコールバック
コールバックにif
やunless
オプションを利用し、条件を設定することができます。条件を設定することで指定条件時のみコールバックが実行されます。
シンボルを利用して条件をつける
class User < ApplicationRecord
before_create :generate_username, if: :new_record?
private
def generate_username
self.username = SecureRandom.hex(6)
end
end
コールバックの条件をシンボルとしてif
またはunless
に渡すことができます。
Procを利用して条件をつける
class User < ApplicationRecord
before_create :generate_username, if: Proc.new { |user| user.new_record? }
end
コールバックの条件をProcとして、if
またはunless
に渡すことができます。