2010-07-24 3 views
0

Les rails d'apprentissage et quelque chose sent un peu drôle.Rails formes aide: traitant des formes complexes et params (c'est mon premier jour avec des rails)

J'ai le formulaire suivant pour mettre à jour les quantités dans un panier.

<% form_for(:cart, @cart.items, :url => { :action => "update_cart" }) do |f| %> 
<table> 
    <tr> 
     <th>Item</th> 
     <th>Quantity</th> 
     <th>Price</th> 
    </tr> 
    <% for item in @cart.items %> 
     <% f.fields_for item, :index => item.id do |item_form| %> 
     <tr> 
      <td><%=h item.title %></td> 
      <td><%=item_form.text_field :quantity, :size => 2 %> 
       <span>@ <%=h number_to_currency(item.item_price) %></span></td> 
      <td><%=h number_to_currency(item.line_price) %></td> 
     </tr> 
     <% end %> 
    <% end %> 
    <tr> 
     <td colspan="2">Total:</td> 
     <td><%=h number_to_currency(@cart.total_price) %></td> 
    </tr> 
</table> 
<%=submit_tag 'Update Cart' %> 
<% end %> 

Dans mon action update_cart, j'itérer les articles de panier existants et définir la nouvelle quantité:

def update_cart 
    @cart = find_cart 

    @cart.items.each do |item| 
    quantity = params[:cart][:cart_item][item.id.to_s][:quantity].to_i 
    @cart.update_quantity_for(item, quantity) 
    end 

    redirect_to :action => 'cart' 
end 

Je n'ai pas un contrôleur d'interface REST pour les chariots ou les articles de panier. Existe-t-il une meilleure façon de traiter cette structure de données params profonde? L'expression params[:cart][:cart_item][item.id.to_s][:quantity].to_i me semble dangereuse pour les données de formulaire invalides.

+0

En guise de note rapide, 'pour item dans @ cart.items.each' est inutile, vous pouvez simplement utiliser' pour item dans @ cart.items' ou '@cart.items.each do | item | '. – jtbandes

+0

@jtbandes vous avez raison, merci. –

Répondre

2

La méthode correcte consiste à utiliser l'attribut "accept_nested_attributes" dans le modèle de chariot. Vous pouvez ensuite utiliser la méthode de mise à jour de CartController pour enregistrer vos éléments. (http://railscasts.com/episodes/196-nested-model-form-part-1)

De plus, votre prix total devrait probablement être une méthode définie dans le modèle Panier.

Questions connexes