在Rails中使用强参数仅更新一个属性

问题描述 投票:0回答:1

我打算只更新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?没有一个公认的工作解决方案。仅更新一个属性时是否存在质量分配的风险?如果是这样,在这种情况下如何使用强参数?

ruby-on-rails
1个回答
1
投票

我想这个错误是由于需要product_id存在的模型验证

不,那是因为你的参数是这样的:

{ :instock => '1' }

你强大的params定义要求它们是这样的

{ :color => { :instock => '1' }
  ^^^^^^^^^

理解强对策的目的很重要:白名单。当你只挑选一个被分配的参数时,这是另一种类型的白名单。所以,是的,这样做是安全的:

 @color.update_attributes(instock: params[:new_stock])
© www.soinside.com 2019 - 2024. All rights reserved.