Ruby on rails 在Rails中,如何在没有警告的情况下对现有模型对象进行体量指定?

Ruby on rails 在Rails中,如何在没有警告的情况下对现有模型对象进行体量指定?,ruby-on-rails,strong-parameters,Ruby On Rails,Strong Parameters,在Rails应用程序中,可以将参数中的一些值指定给现有模型对象,如下所示: model.attributes = params model.attributes = params.permit(:a, :b, :c) 这显然会返回一个禁止属性错误,但可以这样避免: model.attributes = params model.attributes = params.permit(:a, :b, :c) 但是,尽管这样做有效,但如果params包含调用中未提及的密钥,则它仍会向控制台输出

在Rails应用程序中,可以将参数中的一些值指定给现有模型对象,如下所示:

model.attributes = params
model.attributes = params.permit(:a, :b, :c)
这显然会返回一个禁止属性错误,但可以这样避免:

model.attributes = params
model.attributes = params.permit(:a, :b, :c)
但是,尽管这样做有效,但如果params包含调用中未提及的密钥,则它仍会向控制台输出一条消息,以允许:

警告毫无意义,因为已经知道params包含其他键,并且正在使用permit选择所需的子集。这样做是可以避免的

model.attributes = params.slice(:a, :b, :c).permit!
有没有一种更合适的方法来执行此分配,而不需要首先对哈希进行切片

警告毫无意义,因为已经知道params包含其他键,并且正在使用permit选择所需的子集

你误解了这个警告的目的。当您调试为什么表单不更新您今天添加的这个新字段时,这是非常有价值的。有了警告,查看服务器日志,您会很快发现您忘记更新强参数筛选

此外,该警告仅在开发/测试环境中显示。它不会出现在生产中

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

# 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

谢谢你的回答;关于最后一部分,我不是在正常的控制器场景中这样做的。如果我这样做,我会完全按照你在回答中所说的去做。