before_actionとは
アクション実行前に実行されるメソッド。 アクション実行後に実行されるメソッドは「after_action」 両方で実行する場合には「around_action」を利用する。 これらの処理を**フィルタ**という。コントローラ(クラス)に記載すれば、各アクションの実行前/実行後に実行される。
例)
hoges_controller.rb
class HogesController < ApplicationController
# 実行前メソッド
# onlyオプションを指定すると、指定したアクションでのみ利用する。
before_action :実行前メソッド, only: %i[index show]
# 実行後メソッド
# exceptオプションを指定すると、指定したアクションでは利用しない
after_action :実行後メソッド, except: :new
#その他諸々
end
実行前メソッドを複数指定したい場合の記述方法
**方法その1(複数回、before_actionを記述する)**hoges_controller.rb
class HogesController < ApplicationController
before_action :実行前メソッド1
before_action :実行前メソッド2
end
方法その2(before_actionにブロックを渡す)
hoges_controller.rb
class HogesController < ApplicationController
before_action ->{
実行前メソッド1
実行前メソッド2
}
end
before_actionに引数を渡す方法
before_actionにブロックを渡せば、メソッドに引数を渡すことができる。hoges_controller.rb
class HogesController < ApplicationController
before_action ->{
引数付き実行前メソッド("pan")
}
end
フィルタにredirect_toやrenderを含むメソッドを複数指定
例えば、ログインしていない場合にログイン画面に遷移させるメソッドと 何らかの条件で別ページに遷移させるメソッドを「before_action」に指定したとする。application_controller.rb
class ApplicationController < ActionController::Base
def login_check
# ログインしていない場合ログイン画面に遷移させtrueを返す、ログインしている場合falseを返す
return redirect_to :ログイン画面 unless ログインしているか
end
def hoge
# 条件式に一致しない場合、何らかの画面に遷移しtrueを返す、一致する場合falseを返す。
return redirect_to :何らかの画面 unless 条件式
end
end
hoges_controller.rb
class HogesController < ApplicationController
before_action ->{
login_check
hoge
}
end
上記のように「before_action」を指定すると、
複数回redirect_toが実行されるパターンがあるため
そのような場合「AbstractController::DoubleRenderError」が発生する。
対処法
||を利用するhoges_controller.rb
class HogesController < ApplicationController
# login_checkでfalseが返った場合のみhogeを実行する。
before_action ->{
login_check || hoge
}
end