2009-09-12 5 views
0

Je suis en train de construire un panier d'achat simple avec des rails, maintenant je suis en mesure d'ajouter des produits au panier, je veux savoir comment puis-je modifier les produits pendant qu'ils sont dans le panier, je suis en utilisant des sessions pour contrôler les produits dans le panier. voici ce que l'utilisateur voir quand ajouter au panier:modifier le contenu dans ruby ​​sur rails panier

<% @cart.items.each do |item| %> 
<tr> 
    <td> 
     <%= image_tag item.pic , :alt => "#{item.title}" %> 
    </td> 
    <td> 
     <%= link_to "#{item.title}" , store_path(item.product_id) %> 
    </td> 
    <td> 
     <%= item.unit_price %> 
    </td> 
    <td> 
     <%= item.quantity %> 
    </td> 
    <td> 
     <%= item.total_price %> 
    </td> 
    <% end %> 
</tr> 

ce qui est classe CartItem:

class CartItem 

    attr_reader :product, :quantity 

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

    def increment_quantity 
    @quantity += 1 
    end 

    def product_id 
    @product.id 
    end 

    def title 
    @product.name 
    end 

    def pic 
    @pic = @product.photo.url(:thumb) 
    end 

    def unit_price 
    @product.price 
    end 

    def total_price 
    @product.price * @quantity 
    end 

end 

Je veux donner à l'utilisateur cette possibilité de modifier la quantité de produits ou supprimer un produit, non seulement effacer tout le panier. Comment puis je faire ça ?

Répondre

0

Eh bien, vous avez déjà quelque chose de configuration de près. Vous avez la méthode increment_quantity dans votre modèle d'article de panier, ce que vous devez faire est de configurer le modèle de panier pour vous permettre de spécifier un produit, puis appeler une nouvelle méthode, comme suit:

cart.rb (en supposant c'est votre modèle de panier)

def increment_product_quantity(id, quantity) 
    product_to_increment = @items.select{|product| product.product_id == id} 

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

    product_to_increment.quantity = quantity 
end 

def remove_product(id) 
    @items.delete_if {|product| product.product_id == id } 
end 

maintenant, vous devrez modifier votre modèle d'élément de panier où la quantité n'est pas un objet attr_reader, mais un objet attr_accessor, ou créer une méthode pour les articles de panier spécifiquement à l'endroit où vous définissez la quantité; votre choix.

Il y a quelques autres choses qui pourraient être faites, mais c'est à peu près la méthode la plus simple et la plus propre que je puisse recommander pour le moment.

+0

aurais-je besoin pour ajouter une nouvelle action de contrôleur (c.-à-d. Edit_Cart)? Ou est-ce plus judicieux d'ajouter les modifications sur mon action add_to_cart? –

0

Belle question. J'ai réussi à faire fonctionner la fonction de suppression. On dirait que vous suivez les programmeurs pragmatiques Agile Web Development with Rails, livre troisième édition.

Ici, nous allons ...

Pour add_to_cart.html.erb

I ajouté la ligne de tableau ci-dessous, à côté du dernier élément de ligne tr:

<td><%= link_to 'remove', {:controller => 'inventories', :action => 'remove_cart_item', :id => "#{item.getinventoryid}"} %></td> 

Pour CartItem .rb modèle

changé attr_reader: inventaire,: quantité à attr_accessor :inventory, :quantity

def getinventoryid 
    @inventory.id 
end 

Pour modèle Cart.rb:

attr_reader changé: les articles à attr_accessor :items

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

Pour inventories_controller.rb:

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