我打算只更新color
模型的一个属性。该模型具有其他属性设置为通过强参数更新:
def color_params
params.require(:color).permit(:product_id, :name, :instock)
end
在不使用强参数的情况下更新属性instock
时,此更新方法可以正常工作:
def update_stock
@color = Color.find(params[:selected_color])
if @color.update_attributes(instock: params[:new_stock])
flash[:success] = "Stock updated"
else
redirect_to root_path
end
end
要使用强参数,我将if @color.update_attributes(instock: params[:new_stock])
替换为if @color.update_attributes(color_params)
。这将返回错误ActionController::ParameterMissing (param is missing or the value is empty: color):
我认为错误是由于需要product_id
存在的模型验证。类似的帖子Should we use strong params when we update only one attribute?没有一个公认的工作解决方案。仅更新一个属性时是否存在质量分配的风险?如果是这样,在这种情况下如何使用强参数?
我想这个错误是由于需要product_id存在的模型验证
不,那是因为你的参数是这样的:
{ :instock => '1' }
你强大的params定义要求它们是这样的
{ :color => { :instock => '1' }
^^^^^^^^^
理解强对策的目的很重要:白名单。当你只挑选一个被分配的参数时,这是另一种类型的白名单。所以,是的,这样做是安全的:
@color.update_attributes(instock: params[:new_stock])