带参数的before_filter

时间:2011-03-31 22:17:50

标签: ruby-on-rails ruby ruby-on-rails-3 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符号,而是f.e. :project_id(以及:id也存在(针对其他模型)

你会如何解决这个问题?是否可以选择向before_filter操作添加参数(传递右侧参数)?

5 个答案:

答案 0 :(得分:81)

我会这样做:

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。

答案 1 :(得分:61)

用一些语法糖:

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|

由于引入了before_action的同义词Rails 4 before_filter,因此它可以写成:

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

<强> NB

->代表lambda,名为 lambda literal ,在Ruby 1.9中引入

%i将创建一个符号数组

答案 2 :(得分:14)

要继续@alex的回答,如果您想要:except:only某些方法,请遵循以下语法:

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

找到here

答案 3 :(得分:5)

我发现使用花括号而不是do...end的块方法是最清晰的选项

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

before_action只是before_filter

的新首选语法

答案 4 :(得分:-1)

这应该有效:

project = Project.find(params[:project_id] || params[:id])

如果它存在于params散列中,则返回params[:project_id],如果不存在,则返回params[:id]