2010-01-17 3 views
1

Je viens de ramasser le développement Web Agile avec Rails 3rd Ed., Et je vais à travers les chapitres de l'application de dépôt, je suis en train de créer une simple fonction de quantité d'édition, et supprimer la fonction. J'ai eu de la chance avec la fonction de suppression mais pas de chance avec la fonction de modification de quantité. Je vais fournir beaucoup d'informations, alors s'il vous plaît ne vous sentez pas débordé. J'ai trouvé que c'était un problème difficile.problèmes de fonction de quantité simple, panier

Pour add_to_cart.html.erb

<div class="cart-title">Your cart</div> 

<table> 
<% for item in @cart.items %> 
<tr> 

<td><% form_for @cart.items, :url => {:action => "cart_update", :id => "#{item.getinventoryid}"} do |f| %> 
    <%= f.text_field :quantity, :size => '3' %> 
    <%= f.hidden_field :id, :value => "#{item.getinventoryid}" %> 
    <%= f.submit 'cart_update' %> 
<% end %></td> 

<td><%=h item.quantity %> &times;</td> 
<td><%=h item.title %></li></td> 
<td><%=h item.description %></td> 
<td class="item-price"><%= number_to_currency(item.price) %></td> 
<td><%= link_to 'remove', {:controller => 'inventories', :action => 'remove_cart_item', :id => "#{item.getinventoryid}"} %></td> 


</tr> 
<% end %> 

<tr class="total-line"> 
<td colspan="4">Total</td> 
<td class="total-cell"><%= number_to_currency(@cart.total_price) %></td> 
</tr> 
</table> 

<%= button_to "Checkout", :action => 'checkout' %> 
<%= button_to 'Empty cart', :action => 'empty_cart' %> 

inventories_controller:

def cart_update 
     @inventory = Inventory.find(params[:id]) 
     @cart = find_cart 
     @cart.increment_inventory_quantity(params[:inventory]) 
    end 

    def remove_cart_item 
     inventory = Inventory.find(params[:id]) 
     @cart = find_cart 
     @cart.remove_inventory(inventory) 
     redirect_to_index("The item was removed") 
    end 

modèle Cart.rb

attr_accessor :items

def increment_inventory_quantity(id, quantity) 
    inventory_to_increment = @items.select{|item| item.inventory == inventory} 

    # We do this because select will return an array 
    unless product_to_increment.empty? 
     inventory_to_increment = inventory_to_increment.first 
    else 
     # error handling here 
    end 

    inventory_to_increment.quantity = quantity 
end 

def remove_inventory(inventory) 
    @items.delete_if {|item| item.inventory == inventory } 
end 

modèle cart_item.rb

attr_accessor :inventory, :quantity

def getinventoryid 
     @inventory.id 
    end 

Cela produit des résultats étranges: alt text

Notez la quantité apparaît dans les deux articles de ma boucle (# Échouer). Lorsque je soumets le formulaire ArgumentError dans InventoriesController # cart_update erreur nombre incorrect d'arguments (1 pour 2) est retourné. Paramètres en cours de transmission:

{"commit"=>"cart_update", 
"_method"=>"put", 
"authenticity_token"=>"sH1tWXTJPltpSq5XaAkww7259IR5ZiflnqSFB2Zb0IY=", 
"id"=>"50", 
"cart_item"=>{"quantity"=>"16", 
"id"=>"50"}} 
+0

Salut JZ - quelques questions. Premièrement, comment @inventory est-il défini dans le modèle cart_item? Deuxièmement, pouvez-vous fournir plus d'informations sur le "mauvais nombre d'arguments" erreur? Cela aiderait à savoir quelle méthode jetait cette erreur. Merci! –

+0

Salut Jamie, j'ai mis à jour l'erreur ci-dessus; l'erreur provient de la méthode cart_update. Le correctif ci-dessous a fonctionné en termes de correction des unités correctes affichées, mais ma méthode produit toujours le mauvais nombre d'arguments erronés. En termes de @Inventory dans mon cart_item: def initialize (inventaire) \t \t @inventory = inventaire \t \t @Quantity = 1 fin –

Répondre

1

Vous obtenez le mauvais nombre d'arguments erreur car vous passez un argument à @cart.increment_inventory_quantity dans la méthode du contrôleur. Cette méthode nécessite deux arguments. Peut-être

# In your controller: 
def cart_update 
    @inventory = Inventory.find(params[:id]) 
    @cart = find_cart 
    @cart.increment_inventory_quantity(params[:inventory]) # you are passing one thing 
end 
# Then in your model: 
def increment_inventory_quantity(id, quantity) # the method wants two things 
    # ... 

vous aviez l'intention de faire quelque chose comme ceci:

def cart_update 
    @inventory = Inventory.find(params[:cart_item][:id]) 
    @cart = find_cart 
    @cart.increment_inventory_quantity(@inventory.id, params[:cart_item][:quantity]) 
end 
1

Etes-vous sûr que c'est form_for (@ cart.items) et non form_for (item)?

+0

Merci qui corrige les quantités affichées - Je suis encore avoir des problèmes avec la méthode cart_update; Il produit toujours le mauvais nombre d'arguments erreur. –