コールバック
コールバックについて
コールバックとは
コールバックとは、オブジェクトが変わる時に実行できる処理のこと
コールバックを使うことによって、モデルの作成後や保存前などに実行できるコードを書くことが可能
コールバックの種類
メソッド参照例
before_destroy :delete_parents
private
def delete_parents
self.class.delete_by(parent_id: id)
end
コールバックオブジェクト
class BankAccount < ActiveRecord::Base
before_save EncryptionWrapper.new
after_save EncryptionWrapper.new
after_initialize EncryptionWrapper.new
end
class EncryptionWrapper
def before_save(record)
record.credit_card_number = encrypt(record.credit_card_number)
end
def after_save(record)
record.credit_card_number = decrypt(record.credit_card_number)
end
alias_method :after_initialize, :after_save
private
def encrypt(value)
# Secrecy is committed
end
def decrypt(value)
# Secrecy is unveiled
end
end
モデルが作成される時に実行
説明
モデルが作成される時に実行
使い方
after_initialize do(ブロック引数)
例
after_initialize do |user|
puts "初期化"
end
ソースコード
モデルをタッチするたびに実行
説明
モデルをタッチするたびに実行
コールバックメソッドの一つ
使い方
モデル.touch(名前.., time: 時間=nil)
例
product.touch
# updates updated_at/on with current time
product.touch(time: Time.new(2015, 2, 16, 0, 0, 0))
# updates updated_at/on with specified time
product.touch(:designed_at)
# updates the designed_at attribute and updated_at/on
product.touch(:started_at, :ended_at)
# updates started_at, ended_at and updated_at/on attributes
アクションの前に処理を実行
説明
アクションの前に処理を実行
使い方
before_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
例
アクションの前に処理を実行
before_action :require_permission
def require_permission
unless current_user.partner? || current_user.admin?
redirect_to admin_root_path, alert: 'ここから先は管理者限定です!'
end
end
実行するアクションを指定
before_action :render_form, only: [:new :edit]
def render_form
render 'form'
end
複数指定
before_action :user1
before_action :user2
ソースコード
アクションの後に処理を実行
説明
アクションの後に処理を実行
使い方
after_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
例
アクションの後に処理を実行
after_action :store_location
実行するアクションを指定
after_action :render_form, only: [:new :edit]
複数指定
after_action :user1
after_action :user2
ソースコード
アクションの前後に処理を実行
説明
アクションの前後に処理を実行
使い方
around_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
例
アクションの前後に処理を実行
around_action :render_form, only: [:new :edit]
複数指定
around_action :user1
around_action :user2
ソースコード
アクションの前に処理を追加
説明
アクションの前に処理を追加
before_actionより後に処理
使い方
append_before_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
ソースコード
アクションの後に処理を追加
説明
アクションの後に処理を追加
after_actionより後に処理
使い方
append_after_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
例
append_after_action :verify_same_origin_request
ソースコード
アクションの前後に処理を追加
説明
アクションの前後に処理を追加
around_actionより後に処理
使い方
append_around_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
ソースコード
アクションの前に処理を追加
説明
アクションの前に処理を追加
before_actionより前に処理
使い方
prepend_before_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
ソースコード
アクションの後に処理を追加
説明
アクションの後に処理を追加
after_actionより前に処理
使い方
prepend_after_action(コールバック名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
ソースコード
アクションの前後に処理を追加
説明
アクションの前後に処理を追加
around_actionより前に処理
使い方
prepend_around_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック)
ソースコード
アクションの前のコールバックをスキップ
説明
アクションの前のコールバックをスキップ
使い方
skip_before_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック=nil)
ソースコード
アクションの後のコールバックをスキップ
説明
アクションの後のコールバックをスキップ
使い方
skip_after_action(アクション名, only: 実行するアクション=nil, except: 実行しないアクション=nil, if: 実行する条件を指定=nil, unless: 実行されない条件を指定=nil, ブロック=nil)
ソースコード
アクションに関するコールバックをスキップ
説明
アクションに関するコールバックをスキップ
使い方
skip_around_action(コールバック名)
ソースコード
デフォルトのコールバックを上書き
説明
デフォルトのコールバックを上書き
使い方
define_model_callbacks(アクション名: only: タイプ)
タイプ
タイプ | 説明 |
---|---|
:after | 後 |
:before | 前 |
:around | 前後 |
例
define_model_callbacks :initializer, only: :after