简体   繁体   English

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

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

I have an Order and Items , with join table OrderItems that act as line items in an order. 我有一个OrderItems ,连接表OrderItems充当订单中的订单项。 In order#show , I want to display all instances of Items and be able to add this to the order through creating a new OrderItem . order#show ,我想要显示Items所有实例,并能够通过创建新的OrderItem将其添加到订单中。 The issue is that when I post the form, order_item#create makes 40 new order_items for all Items , instead of just creating one instance of OrderItem for that one item I want to add. 问题是,当我发布表单时, order_item#create为所有Items order_item#create 40个新的order_items ,而不仅仅是为我要添加的一项创建OrderItem一个实例。

Here is the OrderItems controller: 这是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

Here is the form in order#show 这是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 %>

Actually, the order_item#create action isn't creating the 40 order_items . 实际上, order_item#create操作不是创建40个order_items It's your form: 这是您的表格:

<%= form_for [@user, @order, @order.order_items.create(:item_id => item.id)] do |f| %>

Change the create to build and that way it won't save the 40 instances. create更改为build ,这样就不会保存40个实例。 It will only save the one you hit submit for. 它只会保存您点击提交的那一个。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM