在Rails应用程序中,可以将params
中的一些值分配给现有模型对象,如下所示:
model.attributes = params
这显然会返回ForbiddenAttributesError
,但可以这样避免:
model.attributes = params.permit(:a, :b, :c)
但是,尽管可行,但如果params
包含permit
调用中未提及的密钥,它仍会向控制台输出消息:
Unpermitted parameters: d, e, f
警告毫无意义,因为已经知道params
包含其他密钥,而permit
正用于选择所需的子集。这可以通过
model.attributes = params.slice(:a, :b, :c).permit!
是否有更合适的方法来执行此分配,而不需要首先slice
哈希?
答案 0 :(得分:0)
警告毫无意义,因为已经知道params包含额外的密钥,并且许可用于选择所需的子集。
您误认为此警告的目的。当您调试为什么表单不更新您刚刚添加的新字段时,它非常有价值。通过警告,查看服务器日志,您可以快速发现您忘记更新strong_params过滤。
此外,警告仅在开发/测试环境中显示。它不会出现在制作中。
但是假设你真的讨厌这个警告。在这种情况下,您可以在app config中执行此操作:
# possible values: :raise, :log
config.action_controller.action_on_unpermitted_parameters = false
顺便说一下,你的代码有点不正统。常见的方法是将过滤代码保存在一个方法中,并从创建/更新(以及您需要的其他方法)中调用它。
def update
@product = ...
if @product.update_attributes(product_params)
...
else
...
end
end
private
def product_params
params.require(:product).permit(:a, :b, :c)
end