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

条件付きコールバック

コールバックにifunlessオプションを利用し、条件を設定することができます。条件を設定することで指定条件時のみコールバックが実行されます。

シンボルを利用して条件をつける

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に渡すことができます。

results matching ""

    No results matching ""