为什么在强参数中 "permit"?

Why "permit" in Strong Parameters?

这是怎么回事:

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

比这个更安全?

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

为什么需要 require(:model1)

它并没有真正更安全,它只是一种将参数组织成对象的方式。

如果你说 params.require(:model).permit(:a) 那就是期望参数以 { model: { a: <val> } } 的形式出现。这种 nested-hash 样式命名空间是生成的脚手架的默认设置,但没有它路由也能正常工作(我有一段时间没有使用 params.require 了)。

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

所以你不需要使用params.requireparams.permit,你可以从头开始写:

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

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