Rails form_for 中的迭代是在创建时添加模型的所有实例
Iteration in Rails form_for is adding all instances of model on create
我有一个 Order
和 Items
,连接 table OrderItems
作为订单中的行项目。在 order#show
中,我想显示 Items
的所有实例,并能够通过创建新的 OrderItem
将其添加到订单中。问题是,当我 post 表单时,order_item#create
为所有 Items
创建了 40 个新的 order_items
,而不是仅仅为那个 OrderItem
创建一个实例我要添加的项目。
这里是 OrderItems
控制器:
def create
@order_item = @order.order_items.build(order_item_params)
if @order_item.save
flash[:notice] = "Your item was added"
redirect_to [@user, @order]
else
flash[:error] = "Your item was not added. Please try again."
redirect_to [@user, @order]
end
end
这是order#show
中的表格
<% @items.each do |item| %>
<div>
<%= form_for [@user, @order, @order.order_items.create(:item_id => item.id)] do |f| %>
<div class="form-group">
<%= f.label item.name %>
<%= f.label "$#{item.price.to_s}" %>
</div>
<div class="form-group">
<%= f.label 'quantity' %>
<%= f.text_area :quantity %>
</div>
<div class="form-group">
<%= f.label 'item id' %>
<%= f.text_area :item_id %>
</div>
<div class="form-group">
<%= f.submit 'Add Item', class: 'btn' %>
</div>
<% end %>
</div>
<% end %>
实际上,order_item#create
操作并未创建 40 order_items
。这是你的表格:
<%= form_for [@user, @order, @order.order_items.create(:item_id => item.id)] do |f| %>
将 create
更改为 build
,这样就不会保存 40 个实例。它只会保存您点击提交的那个。
我有一个 Order
和 Items
,连接 table OrderItems
作为订单中的行项目。在 order#show
中,我想显示 Items
的所有实例,并能够通过创建新的 OrderItem
将其添加到订单中。问题是,当我 post 表单时,order_item#create
为所有 Items
创建了 40 个新的 order_items
,而不是仅仅为那个 OrderItem
创建一个实例我要添加的项目。
这里是 OrderItems
控制器:
def create
@order_item = @order.order_items.build(order_item_params)
if @order_item.save
flash[:notice] = "Your item was added"
redirect_to [@user, @order]
else
flash[:error] = "Your item was not added. Please try again."
redirect_to [@user, @order]
end
end
这是order#show
<% @items.each do |item| %>
<div>
<%= form_for [@user, @order, @order.order_items.create(:item_id => item.id)] do |f| %>
<div class="form-group">
<%= f.label item.name %>
<%= f.label "$#{item.price.to_s}" %>
</div>
<div class="form-group">
<%= f.label 'quantity' %>
<%= f.text_area :quantity %>
</div>
<div class="form-group">
<%= f.label 'item id' %>
<%= f.text_area :item_id %>
</div>
<div class="form-group">
<%= f.submit 'Add Item', class: 'btn' %>
</div>
<% end %>
</div>
<% end %>
实际上,order_item#create
操作并未创建 40 order_items
。这是你的表格:
<%= form_for [@user, @order, @order.order_items.create(:item_id => item.id)] do |f| %>
将 create
更改为 build
,这样就不会保存 40 个实例。它只会保存您点击提交的那个。