gpt4 book ai didi

ruby-on-rails - 如何以正确的方式防止对关联进行大规模分配?

转载 作者:行者123 更新时间:2023-12-04 05:40:39 25 4
gpt4 key购买 nike

假设我有一个模型 Warehouse , 型号 Car , 和一个模型 Dealer .

型号 Car就好像:

attr_accessible :make, :year
belongs_to :warehouse
belongs_to :dealer

Controller Cars就好像:
def create
car = current_dealer.find(params[:car][:warehouse_id]).cars.new(params[:car])
car.save!
end
Cars#new的观点就好像:
<%= semantic_form_for @car do |f| %>
<%= f.inputs do %>
<%= f.input :warehouse, :include_blank => false %>
<%= f.input :make %>
<%= f.input :year %>
<% end %>
<% end %>

经销商可以在添加汽车时选择一个仓库,上面的代码可以防止批量分配(也就是经销商将汽车添加到他们不拥有的仓库),但是它引发了一个异常,说 :warehouse_id不能批量赋值,那是因为它也带了参数,如 params[:car][:warehouse_id] .

如何在不手动分配属性的情况下摆脱该错误?无论如何,这是一个好方法吗?

附言我试过 params[:car].delete(:warehouse_id)但这看起来不是这样做的正确方法。

最佳答案

由于 :warehouse_id 不是汽车的可大量分配的属性,因此您不能将其作为汽车的属性从表单中发布。如果您以这种方式命名参数,即使您在 Controller 中对它们不做任何操作,Rails 也会引发批量分配错误。

而不是做(非形式特定的):

<%= f.hidden_field :warehouse_id %>

做:
<%= hidden_field_tag :warehouse_id, @car.warehouse_id %>

我对 formtastic 不太熟悉,但我认为上面的行应该有效。

在 Controller 中:
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

这有点乏味,我知道。不幸的是,保护您的代码需要更多的努力。

结论 : params[:car][:warehouse_id] = 质量分配

关于ruby-on-rails - 如何以正确的方式防止对关联进行大规模分配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11285074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com