Railsドキュメント

コールバック

コールバックについて

コールバックとは

コールバックとは、オブジェクトが変わる時に実行できる処理のこと
コールバックを使うことによって、モデルの作成後や保存前などに実行できるコードを書くことが可能

コールバックの種類

メソッド参照例

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

ソースコード