私はこのようなことをするメソッドを持っています:
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アクションにパラメーターを追加するオプションはありますか(正しいパラメーターを渡すため)?
私はこのようにします:
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です。
いくつかの構文糖を使用:
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_action
、before_filter
の同義語が導入されたため、次のように記述できます。
before_action ->(param=params[:id]) { find_campaign param }, only: %i|show edit update destroy|
[〜#〜] nb [〜#〜]
->
はlambda
の略で、lambda literalと呼ばれ、Ruby 1.9
%i
はシンボルの配列を作成します
@alexの回答を続けるには、:except
または:only
いくつかのメソッド、構文は次のとおりです。
before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end
見つかった ここ 。
do...end
の代わりに中括弧を使用するブロックメソッドが最も明確なオプションであることがわかりました
before_action(only: [:show]) { authenticate_rights(id) }
before_action
はbefore_filter
の新しい優先構文です