👏
prepend_before_action, before_action, append_before_action の実行順
はじめに
Ruby on Rails のコントローラーにはアクションが実行される前に特定のメソッドを実行するためのコールバックとして prepend_before_action
、before_action
、append_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_action
は before_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
ENECHANGEグループは、「エネルギー革命」を技術革新により推進し、より良い世界を創出することをミッションとするエネルギーベンチャー企業です。 enechange.co.jp/
Discussion