before_actionのifオプションとskip_before_actionで親コントローラーのbefore_actionを無効にする
before_actionの使い方
before_actionを使うと、各アクション実行前に、before_actionで指定したメソッドが実行される。
before_action :メソッド
この使い方は知っていたけど、今回はifオプションを使うと便利だったので、ifオプションについて残しておきたい。
ifオプション
今回以下のようにbefore_actionで認証系にメソッドが使われているが、特定のコントローラだけ無効にしたい時にifオプションが使えた。
class SampleController < ApplicationController before_action :require_login_for_api end
以下のように条件チェック用のメソッドをSampleControllerで用意する。
class ApplicationController < ActionController::Base before_action :require_login_for_api, if: :check? def check? true end end
そして継承先のコントローラーでもfalseになるメソッドを用意する。
class SampleController < ApplicationController def check? false end end
こうすることで、SampleControllerだけ親コントローラーのrequire_login_for_apiを無効にすることができた。
skip_before_action
先ほどのifオプションでも親コントローラのbefore_actionを無効にできるが、この場合CIを通した時に tracerouteのエラーが発生した。
そこで、skip_before_action
のコールバックを使うともっとスッキリ書くことができ、CIを通すことができた。
こちらも自分のために残しておきたい。
class SampleController < ApplicationController skip_before_action :require_login_for_api end
しかし、セキュリティに穴を開けるなどであれば使う時はしっかり考えたい。