👏

prepend_before_action, before_action, append_before_action の実行順

2024/10/15に公開

はじめに

Ruby on Rails のコントローラーにはアクションが実行される前に特定のメソッドを実行するためのコールバックとして prepend_before_actionbefore_actionappend_before_action が用意されています。
クラスを継承した場合などの順番がなかなかまとまっていない気がしたので検証してみました。

実行順

before_action

before_action はアクションの実行前に実行されるコールバックで、複数の before_action が設定された場合は設定した順番(before_action :method が読み込まれた順番)に実行されます。

class ApplicationController < ActionController::Base

  before_action :before1
  before_action :before2

  private

  def before1
    puts "before1"
  end

  def before2
    puts "before2"
  end
end


class ChildController < ApplicationController

  before_action :child_before1

  def index
    puts "index"
  end

  private

  def child_before1
    puts "child_before1"
  end
end
before1
before2
child_before1
index

prepend_before_action

prepend_before_actionbefore_action の前に実行され、prepend_before_action が設定されたのとは逆順で実行されます。

class ApplicationController < ActionController::Base

  prepend_before_action :before1
  prepend_before_action :before2

  private

  def before1
    puts "prepend1"
  end

  def before2
    puts "prepend2"
  end
end

class ChildController < ApplicationController

  prepend_before_action :child_before1

  def index
    puts "index"
  end

  private

  def child_before1
    puts "child_prepend1"
  end
end
child_prepend1
prepend2
prepend1
index

append_before_action

append_before_actionリファレンスには before_action より後とあるが実際は before_action の ailias であるため before_action と同じ順番で実行されます。

class ApplicationController < ActionController::Base

  before_action :before1
  append_before_action :append1
  before_action :before2

  private

  def before1
    puts "before1"
  end

  def before2
    puts "before2"
  end

  def append1
    puts "append1"
  end
end

class ChildController < ApplicationController

  before_action :child_before1

  def index
    puts "index"
  end

  private

  def child_before1
    puts "child_before1"
  end
end
before1
append1
before2
child_before1
index

Discussion