2010-01-18 9 views
0

J'ai un panier très simple qui affiche la quantité d'article dans un champ texte et le nom de l'article. Je peux aller chercher les bonnes données, je ne peux pas passer mes deux arguments dans ma méthode (numéro d'inventaire et quantité). Je reçois une erreur d'argument dans ma méthode cart_update du contrôleur d'inventaire.Comment puis-je passer 2 arguments en utilisant un formulaire simple?

add_to_cart.html.erb

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

modèle cart_item.rb

attr_accessor :inventory, :quantity 

    def initialize(inventory) 
     @inventory = inventory 
     @quantity = 1 
    end 

modèle cart.rb

attr_accessor :items

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

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

    inventory_to_increment.quantity = quantity 
end 

inventories_controller.rb

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

L'erreur se lit comme suit:ArgumentError in InventoriesController#cart_update

inventories_controller.rb: 24: dans increment_inventory_quantity' inventories_controller.rb:24:in cart_update »

avec les paramètres suivants:

{"commit"=>"cart_update", 
"quantity"=>"3", 
"_method"=>"put", 
"authenticity_token"=>"CK6to1uGWPszjz8vfL1Er3DLgi8cIMtLxfFb49a4wCE=", 
"id"=>"5", 
"cart_item"=>{"quantity"=>"11", 
"id"=>"5"}} 

Je suis vraiment confus parce qu'il semble que je passe les paramètres dont j'ai besoin. En outre, l'URL est au format: http://localhost:3000/inventories/cart_update/5?quantity=3, ce qui est également ce que je m'attendais à voir. Qu'est-ce que je fais c'est évidemment faux?

Merci à l'avance!

Répondre

0

Tout changement ligne 3 de cart_update, et utiliser à la place:

if(params[:cart_item] && params[:cart_item][:id]) 
    @cart.increment_inventory_quantity(params[:cart_item][:id], params[:cart_item][:quantity]) 
else 
    # Error handling 
end 

Vous pouvez voir vos données POST:

{ ... , 
    "cart_item"=>{"quantity"=>"11", "id"=>"5"} 
} 

Rails est l'imbrication des cart_item détails dans son propre hachage.

+0

J'ai suivi votre solution: Returned est: méthode non définie quantité = » pour []: Array avec ces params: Paramètres: { "commit"=> "cart_update", "_method"=> "put", "authenticity_token" => "CK6to1uGWPszjz8vfL1Er3DLgi8cIMtLxfFb49a4wCE =" "id" => "5", "cart_item" => { "quantité" => "1" "id" => "5" }} –

+0

@JZ J'ai supposé que '#error handling here' signifiait que vous aviez une erreur de gestion. Votre instruction 'select' échoue, elle renvoie donc un tableau vide. Votre script ne fait rien au tableau, donc votre dernière ligne de «increment_inventory_quantity» exécute effectivement ce '[] .quantity = 1' qui échouera bien sûr. –

+0

Merci! Ma balise #error handling est un rappel pour moi de l'ajouter plus tard. –