2015-07-16 5 views
1

J'ai un Order et Items, avec la table de jointure OrderItems qui agissent comme des éléments de campagne dans un ordre. Dans order#show, je veux afficher toutes les instances de Items et être en mesure d'ajouter à la commande en créant un nouveau OrderItem. Le problème est que lorsque je publie le formulaire, order_item#create fait 40 nouveau order_items pour tous Items, au lieu de créer simplement une instance de OrderItem pour ce seul élément que je veux ajouter.Itération dans les rails form_for ajoute toutes les instances de modèle sur créer

Voici le contrôleur 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 

Voici la forme 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 %> 

Répondre

0

En fait, l'action order_item#create ne crée pas les 40 order_items. Il est votre formulaire:

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

Modifier le create à build et de cette façon, il ne sauvera pas les 40 cas. Cela ne sauvera que celui pour lequel vous vous êtes soumis.

+0

Réponse parfaite! –