在生成mass_assignment错误之前,使用Hash#exclude排除控制器操作中的嵌套表单字段?

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

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_assignmentexception在我的除了代码有机会删除不应该由表单发送的参数之前触发,所以我回到原点。

在获取mass_assignment错误之前,如何确保删除表单不应发送的字段?

据我所知,在new调用期间应该发生mass_assignment错误,所以你的方式应该有效。 虽然我从未使用过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方法(没有bang),它给你一个副本,而不是从原始哈希中删除它。