Rails form_for 中的迭代是在创建时添加模型的所有实例

Iteration in Rails form_for is adding all instances of model on create

我有一个 OrderItems,连接 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 个实例。它只会保存您点击提交的那个。