带参数的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
符号,但fe :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文字 ,在Ruby 1.9中介绍
%i
将创build一个符号数组
继续@alex'的答案,如果你想:except
或:only
一些方法,这里是语法:
before_filter :only => [:edit, :update, :destroy] do |c| c.authenticate_rights params[:id] end
在这里find。
我发现使用大括号的块方法,而不是do...end
是最明确的select
before_action(only: [:show]) { authenticate_rights(id) }
before_action
只是before_filter
的较新的首选语法
这应该工作:
project = Project.find(params[:project_id] || params[:id])
这应该返回params[:project_id]
如果它存在于参数散列中,或者返回params[:id]
如果不是。