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

In Rails, how can a mass-assignment be made to an existing model object without warnings?

在 Rails 应用程序中,可以将 params 中的一些值分配给现有模型对象,如下所示:

model.attributes = params

这显然会 return 一个 ForbiddenAttributesError 但可以这样避免:

model.attributes = params.permit(:a, :b, :c)

然而,尽管这有效,但如果 params 包含在对 permit 的调用中未提及的密钥,它仍会向控制台输出一条消息:

Unpermitted parameters: d, e, f

该警告毫无意义,因为已经知道 params 包含其他键,并且 permit 正用于 select 所需的子集。可以通过

来避免
model.attributes = params.slice(:a, :b, :c).permit!

是否有更合适的方法来执行此分配,不需要先 slice 哈希?

The warning is pointless because it's already known that params contains additional keys and permit is being used to select the required subset.

您误解了此警告的目的。当你调试为什么你的表单没有更新你今天添加的这个新字段时,这是非常有价值的。有了警告,查看服务器日志您可以很快发现您忘记更新 strong_params 过滤。

此外,警告只会在 dev/test 环境中显示。它不会出现在生产中。

但是假设您真的讨厌那个警告。在这种情况下,您可以在您的应用配置中执行此操作:

# possible values: :raise, :log 
config.action_controller.action_on_unpermitted_parameters = false

顺便说一句,你的代码有点不正统。常见的方法是将过滤代码保留在一个方法中,并从 create/update (以及您需要的任何其他地方)

调用它
def update
  @product = ...

  if @product.update_attributes(product_params)
    ...
  else
    ...
  end
end

private

def product_params
  params.require(:product).permit(:a, :b, :c)
end