0

我目前在我的销售控制器中有一个创建操作,如下所示:

def create
    @sale = Sale.new(params[:sale].except(:vehicles_attributes))
    if @sale.save
      redirect_to @sale, :notice => "Successfully created sale."
    else
      render :action => 'new'
    end
end

目的是排除一些仅用于填充链接选择且不应提交的属性(它们没有列)。

使用上面的控制器代码,我发现参数仍然包含"sale"=>{"vehicles_attributes"=>{"0"=>{"make"=>"","model"=>""}}},所以我似乎错过了控制器代码中的某些内容。

编辑:经过更多的挖掘,我发现在我的异常代码有机会删除不应该由表单发送的参数之前,mass_assignment 异常正在触发,所以我回到了第一个问题。

如何确保在收到 mass_assignment 错误之前删除不应由表单发送的字段?

4

1 回答 1

1

据我所知,mass_assignment 错误应该在new通话期间发生,所以你的方式应该可行。虽然我从来没有使用过这种except方法。您是否尝试过使用该reject!方法?

def create
  params[:sale].reject! { |k, v| k == :vehicles_attributes }
  @sale = Sale.new(params[:sale])
  if @sale.save
    redirect_to @sale, :notice => "Successfully created sale."
  else
    render :action => 'new'
  end
end

如果您需要保留它,:vehicles_attributes您还可以使用该reject方法(没有爆炸),它为您提供一个副本,而不是从原始哈希中删除它。

于 2012-08-31T16:51:38.287 回答