継承元のApplicationControllerに定義したbefore_actionと各コントローラーに定義したbefore_actionの実行順
継承元のコントローラー
class ApplicationController < ActionController::Base before_action :puts_base1, :puts_base2 before_action :puts_base3 private def puts_base1 p 'ApplicationController:1' end def puts_base2 p 'ApplicationController:2' end def puts_base3 p 'ApplicationController:3' end end
子供のコントローラー
class PostsController < ApplicationController before_action :puts_child1, :puts_child2 before_action :puts_child3 def index end private def puts_child1 p 'PostsController:1' end def puts_child2 p 'PostsController:2' end def puts_child3 p 'PostsController:3' end end
これでこの posts#index にアクセスすると以下のように表示される
"ApplicationController:1" "ApplicationController:2" "ApplicationController:3" "PostsController:1" "PostsController:2" "PostsController:3"
先に子供の方を呼びたい場合は prepend_before_action
を利用する
試しに :puts_child3
だけ変えてみると
class PostsController < ApplicationController before_action :puts_child1, :puts_child2 prepend_before_action :puts_child3 # <== Changed def index end private def puts_child1 p 'PostsController:1' end def puts_child2 p 'PostsController:2' end def puts_child3 p 'PostsController:3' end end
このような順番で処理される
"PostsController:3" "ApplicationController:1" "ApplicationController:2" "ApplicationController:3" "PostsController:1" "PostsController:2"