Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何以正确的方式防止关联上的批量指定?_Ruby On Rails_Mass Assignment - Fatal编程技术网

Ruby on rails 如何以正确的方式防止关联上的批量指定?

Ruby on rails 如何以正确的方式防止关联上的批量指定?,ruby-on-rails,mass-assignment,Ruby On Rails,Mass Assignment,比如说,我有一个模型仓库,一辆模型汽车和一个模型经销商 模型车是这样的: 汽车控制器类似于: Carsnew的视图如下所示: 经销商可以在添加汽车时选择仓库,上述代码受批量分配保护a.k.a.经销商将汽车添加到他们不拥有的仓库,但它引发了一个异常,即:仓库id不能进行批量分配,这是因为它也作为参数[:car][:warehouse\u id]带来 如何在不手动分配属性的情况下消除该错误?这是一个好方法吗 另外,我尝试了params[:car]。删除:warehouse\u id,但这似乎不是正确

比如说,我有一个模型仓库,一辆模型汽车和一个模型经销商

模型车是这样的:

汽车控制器类似于:

Carsnew的视图如下所示:

经销商可以在添加汽车时选择仓库,上述代码受批量分配保护a.k.a.经销商将汽车添加到他们不拥有的仓库,但它引发了一个异常,即:仓库id不能进行批量分配,这是因为它也作为参数[:car][:warehouse\u id]带来

如何在不手动分配属性的情况下消除该错误?这是一个好方法吗


另外,我尝试了params[:car]。删除:warehouse\u id,但这似乎不是正确的方法。

由于:warehouse\u id不是car的可批量分配属性,因此不能从表单中将其作为car的属性发布。如果以这种方式命名参数,即使在控制器中不使用参数,Rails也会引发质量分配错误

而不是做非formtastic特定的:

<%= f.hidden_field :warehouse_id %>
我知道这有点乏味。不幸的是,保护代码需要更多的努力

结论:
参数[:car][:warehouse_id]=批量分配

批量分配仅确定是否可以通过表单或API设置字段,它不控制可以设置的内容。问题是您试图使用批量分配来控制数据的验证或限制。在您的情况下,您希望能够通过用户选择的拣货清单保存仓库id,因此,使用标准参数方法创建汽车必须可用于批量分配

建议的解决方案是首先使用Formtastic选择输入来限制经销商可能选择的值。虽然我不知道您目前是如何使用通用版本的:

f.input :warehouse, :as => :select, :collection => "Whatever your selection rule is"
这应确保表格中仅显示经销商可用的仓库列表

这并不能解决这样一个问题:一个拥有足够技术知识的人可以更改URL中的仓库id,然后仍然发布到他们不拥有的仓库。因此,您还应该在车型上添加验证,以确保只有属于经销商的仓库才是有效选择

这将解决您的问题,保留仓库id的批量分配(您需要),同时确保经销商只能选择属于他们的仓库。

停止使用attr\u accessible,使用

删除可访问属性:make,:year

将gem“强参数”添加到gem文件中

将include ActiveModel::ForbiddenAttributesProtection添加到每个模型中

然后,替换:

car = current_dealer.find(params[:car][:warehouse_id]).cars.new(params[:car])
与:


我很困惑。你想让汽车的仓库可以批量分配吗?@varatis不,不应该这样。只能批量分配:make和:year。是否可以发布与此创建操作关联的视图?看起来您试图从表单中分配它,这与不允许质量分配相反。@varatis,该视图是非常标准的formtastic,例如:false%>…是的,看到问题了吗?您是在说@car的表单_,并试图分配它的一个属性warehouse。这是批量分配。但我怎么让经销商选择他们想要将汽车添加到哪个仓库?Formtastic将仓库id作为参数[:car][:warehouse\u id]发送,这就是问题所在。这确实是问题所在。我对这个插件不太熟悉,但您必须更改该变量的传递方式:@tybro0103是正确的。如果需要仓库可选择,只需将隐藏的\u字段\u标记更改为具有适当值的选择标记即可。关键是你需要一个独立的标签,不能使用你的表单生成器,因为这是用于汽车模型的。听起来这将被烘焙到Rails 4中。上面有RailsCast:不过,我可能还不会完全删除attr_accessible。
<%= f.hidden_field :warehouse_id %>
<%= hidden_field_tag :warehouse_id, @car.warehouse_id %>
def create
  @car = current_dealer.find(params[:warehouse_id]).cars.new(params[:car])
  @warehouse = Warehouse.find(params[:warehouse_id])
  @car.warehouse = @warehouse
  @car.save!
end
f.input :warehouse, :as => :select, :collection => "Whatever your selection rule is"
car = current_dealer.find(params[:car][:warehouse_id]).cars.new(params[:car])
car = current_dealer.find(params[:car][:warehouse_id]).cars.new(params.require(:car).permit([:make, :year]))