Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 允许在Rails 4中具有强参数的特殊情况下使用额外参数_Ruby On Rails_Ruby On Rails 4_Strong Parameters - Fatal编程技术网

Ruby on rails 允许在Rails 4中具有强参数的特殊情况下使用额外参数

Ruby on rails 允许在Rails 4中具有强参数的特殊情况下使用额外参数,ruby-on-rails,ruby-on-rails-4,strong-parameters,Ruby On Rails,Ruby On Rails 4,Strong Parameters,因此,对于一个组织,我希望用户能够编辑有关它的一些内容 params.require(:organization).permit(:name, :location) 但在特殊情况下,我希望管理员能够编辑额外的属性 params.require(:organization).permit(:name, :location, :secrets) 现在我知道我可以使用if语句来选择要使用哪一行,但由于管理员将始终能够编辑原始属性,因此我希望能够轻松地将它们包括在内,如下所示: permitted

因此,对于一个组织,我希望用户能够编辑有关它的一些内容

params.require(:organization).permit(:name, :location)
但在特殊情况下,我希望管理员能够编辑额外的属性

params.require(:organization).permit(:name, :location, :secrets)
现在我知道我可以使用if语句来选择要使用哪一行,但由于管理员将始终能够编辑原始属性,因此我希望能够轻松地将它们包括在内,如下所示:

permitted = params.require(:organization).permit(:name, :location)
permitted.permit(:secrets) if current_user.admin?

有没有办法像那样连着允许通话?或者,在进行许可调用之前,我是否必须执行类似于将属性存储在数组中并有条件地添加额外属性的操作?

这似乎是一种方法:

def permitted_params
  if current_user.admin?
    params.require(:organization).permit(:name, :location, :secrets)
  else
    params.require(:organization).permit(:name, :location)
  end
end

然后在控制器中使用
allowed_params

使用以下技术,无需将相同的参数写入两次,如果属性列表较长,这将非常有用

def organization_params
  attributes = [:name, :location]
  attributes.push(:secrets) if current_user.admin?

  params.require(:organization).permit(attributes)
end

你应该做的很简单:

def organization_params
  basic_filter = %w(name location)
  filter = user.admin? ? basic_filter.push('secrets') : basic_filter
  params.require(:organization).permit(filter)
end
如您所见,这将起作用:

[20] pry(main)> params = ActionController::Parameters.new({
[20] pry(main)*     organization: {  
[20] pry(main)*       name: 'Francesco',    
[20] pry(main)*       location:  'L.A.',    
[20] pry(main)*       secrets: 'secrets'    
[20] pry(main)*     }    
[20] pry(main)* })    
=> {"organization"=>{"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}}
[21] pry(main)> basic_filter = %w(name location)
=> ["name", "location"]
[22] pry(main)> filter = true ? basic_filter.push('secrets') : basic_filter
=> ["name", "location", "secrets"]
[23] pry(main)> params.require(:organization).permit(filter)
=> {"name"=>"Francesco", "location"=>"L.A.", "secrets"=>"secrets"}
如果
user.admin?
false,则结果为

[26] pry(main)> basic_filter
=> ["name", "location", "secrets"]
[27] pry(main)> basic_filter = %w(name location)
=> ["name", "location"]
[28] pry(main)> filter = false ? basic_filter.push('secrets') : basic_filter
=> ["name", "location"]
[29] pry(main)> params.require(:organization).permit(filter)
Unpermitted parameter: secrets
=> {"name"=>"Francesco", "location"=>"L.A."}

这可能会对您有所帮助。

这似乎只允许机密,不允许姓名和位置是的,似乎不可能链接许可证。我不太喜欢这个,特别是因为我有很多特点。除非有人想出更好的答案,否则我会发布一个我正在做的答案。这似乎是我答案的一个稍微复杂的版本,但谢谢你的尝试@TMP是的,事实上我想我做的正是你所做的。这是因为我开始回答这个问题时,只有一个答案(不是你的),我很快就被一些事情打断了。当我回来完成我的答案时,我发现你的答案已经在那里了。。。我很抱歉,我想在你的回答中添加一条评论,让你知道我重复了一个答案,但失败了。因为有人注意到我,所以我必须有50%的声誉才能发表评论(别担心!只是想确保我没有遗漏什么。祝你旅途好运,获得评论的能力!