web-dev-qa-db-ja.com

パラメータ付きのbefore_filter

私はこのようなことをするメソッドを持っています:

before_filter :authenticate_rights, :only => [:show]

def authenticate_rights
  project = Project.find(params[:id])
  redirect_to signin_path unless project.hidden
end

また、他のコントローラーでもこのメソッドを使用したいので、application_controllerに含まれるヘルパーにメソッドをコピーしました。

問題は、一部のコントローラーでは、プロジェクトのIDが:idシンボルではなく、 :project_id(および:idも存在します(別のモデルの場合)

この問題をどのように解決しますか? before_filterアクションにパラメーターを追加するオプションはありますか(正しいパラメーターを渡すため)?

80
choise

私はこのようにします:

before_filter { |c| c.authenticate_rights correct_id_here }

def authenticate_rights(project_id)
  project = Project.find(project_id)
  redirect_to signin_path unless project.hidden
end

どこcorrect_id_hereは、Projectにアクセスするための関連IDです。

81
Alex

いくつかの構文糖を使用:

before_filter -> { find_campaign params[:id] }, only: [:show, :edit, :update, :destroy]

または、さらに空想を得ることにした場合:

before_filter ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

また、Rails 4 before_actionbefore_filterの同義語が導入されたため、次のように記述できます。

before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|

[〜#〜] nb [〜#〜]

->lambdaの略で、lambda literalと呼ばれ、Ruby 1.9

%iはシンボルの配列を作成します

63
Vadym Tyemirov

@alexの回答を続けるには、:exceptまたは:onlyいくつかのメソッド、構文は次のとおりです。

before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end 

見つかった ここ

14

do...endの代わりに中括弧を使用するブロックメソッドが最も明確なオプションであることがわかりました

before_action(only: [:show]) { authenticate_rights(id) }

before_actionbefore_filterの新しい優先構文です

5
Subtletree