LoginSignup
58
46

More than 5 years have passed since last update.

before_actionで複数メソッドの呼び出し& before_actionに引数を渡す

Last updated at Posted at 2018-03-01

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
58
46
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
58
46