Techioz Blog

異なる条件付きの Rails と before_action

概要

コントローラーには次の before_actions を設定しています。

before_action :require_user, unless: :public?, only: [:show]
before_action :require_user, only: [:index, :edit, :update]

基本的に、パブリックの場合にのみ show アクションでフィルター required_front_user を実行しようとしています?は誤りです。

残りのアクションでは、フィルターを常に実行するようにします。

最初の before_action 設定は無視され、2 番目の設定によって完全に上書きされるようです。

before_action ステートメントを使用して両方の組み合わせを組み合わせることができますか、それともフィルター自体にこのロジックを実装する必要がありますか?

これも機能しません:

before_action :require_user, if: :public?, only: [:index, :edit, :update]
before_action :require_user, unless: :public?, only: [:show, :index, :edit, :update]

公立なら?と思いました。 true を返すと最初のセットアップがロードされ、false を返すと 2 番目のセットアップがロードされます。たまたま 2 番目のセットアップのみがロードされ、パブリックであれば? == true の場合、before_action はトリガーされません。

これは私がそれが機能することがわかったものです:

before_action :require_user_when_public, if: :public?, only: [:index, :edit, :update]
before_action :require_user_when_no_public, unless: :public?, only: [:show, :index, :edit, :update]

protected

def require_user_when_public
  require_user
end

def require_user_when_no_public
  require_user
end

それは非常に醜いです:/

解決策

before_action :require_user, only: require_user_before_actions

private

def require_user_before_actions
 actions = [:index, :edit, :update]
 actions << :show unless public?
 actions
end