在Rails中,如何在没有警告的情况下对现有模型对象进行批量分配?

时间:2015-10-12 11:37:56

标签: ruby-on-rails strong-parameters

在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哈希?

1 个答案:

答案 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