为什么"允许"在强参数?

时间:2017-01-17 06:38:12

标签: ruby-on-rails ruby ruby-on-rails-5

这是怎么回事:

 def model1_params
   params.require(:model1).permit(:key1, :key2) 
 end
这个更安全吗?

 def model1_params
   params.permit(:key1, :key2)
 end

为什么需要require(:model1)

2 个答案:

答案 0 :(得分:2)

它不是更安全,它只是一种将params组织成对象的方式。

如果你说params.require(:model).permit(:a)期望这些参数以{ model: { a: <val> } }的形式出现。这个嵌套哈希样式的命名空间是生成的脚手架的默认值,但是如果没有它,路由可以完美地工作(我暂时没有使用params.require)。

安全参数的目的是阻止你做model.update(params)这样不安全的事情,因为客户可以更新他们选择的任何属性,例如id。用于实现安全参数的<model>_params方法基本上是过滤函数,它返回params哈希的白名单版本。

因此您无需使用params.requireparams.permit,如果您愿意,可以通过划痕编写:

  def whitelisted_params
    params.select { |key| key.in? [:my, :whitelisted, :params] }
  end

答案 1 :(得分:0)

params.permit(:key1, :key2)不安全。这是因为你直接允许params而不将它与一个对象相关联。
另一方面,params.require(:model1).permit(:key1, :key2)更安全,因为您正在使用对象绑定密钥。