rosh-1228のメモ

自身の勉強したことをメモしてます。

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

しかし、セキュリティに穴を開けるなどであれば使う時はしっかり考えたい。