为什么在强参数中 "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.require
或params.permit
,你可以从头开始写:
def whitelisted_params
params.select { |key| key.in? [:my, :whitelisted, :params] }
end
params.permit(:key1, :key2)
不安全。这是因为您直接允许参数而不将其与对象相关联。
另一方面,params.require(:model1).permit(:key1, :key2)
更安全,因为您将密钥与对象绑定。
这是怎么回事:
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.require
或params.permit
,你可以从头开始写:
def whitelisted_params
params.select { |key| key.in? [:my, :whitelisted, :params] }
end
params.permit(:key1, :key2)
不安全。这是因为您直接允许参数而不将其与对象相关联。
另一方面,params.require(:model1).permit(:key1, :key2)
更安全,因为您将密钥与对象绑定。