2016-07-05 3 views
1

Je travaille sur une application E Commerce et je n'arrive pas à comprendre comment je peux mettre à jour la quantité de stock du produit lorsque l'utilisateur ajoute le produit au panier. J'ai suivi un tutoriel pour la plupart de cette application depuis que je suis un débutant total. Mais le tutoriel ne va pas dans la façon de mettre à jour la quantité de stock du produit lorsque l'utilisateur ajoute le produit au panier.Mise à jour en quantité de stock basée sur la quantité de panier dans l'application rails?

jusqu'à présent, j'ai ajouté cette méthode pour le modèle cart.rb

def upd_quantity 
    if cart.purchased_at 
    product.decrement!(quantity: params[:stock_quantity]) 
    end 
end 

Mais je suis vraiment coincé et ne sais pas ce que je fais Ce serait formidable si quelqu'un pouvait jeter un oeil à ce sujet et me conseiller comment implémenter cette fonction à l'application.

ici est un lien vers le repo github https://github.com/DadiHall/brainstore

ce que j'ai en ce moment.

cart_item.rb modèle

class CartItem 
attr_reader :product_id, :quantity 

    def initialize product_id, quantity = 1 
    @product_id = product_id 
    @quantity = quantity 
    end 

    def increment 
    @quantity = @quantity + 1 
    end 

    def product 
    Product.find product_id 
    end 

    def total_price 
    product.price * quantity 
    end 

    def upd_quantity 
    if cart.purchased_at 
    product.decrement!(quantity: params[:stock_quantity]) 
    end 
end 

end 

modèle cart.rb

class Cart 
    attr_reader :items 

    def self.build_from_hash hash 
     items = if hash ["cart"] then 
      hash["cart"] ["items"].map do |item_data| 
     CartItem.new item_data["product_id"], item_data["quantity"] 
     end 

    else 
     [] 
    end 

     new items 
    end 


    def initialize items = [] 
    @items = items 
    end 

    def add_item product_id 
    item = @items.find { |item| item.product_id == product_id } 
    if item 
     item.increment 
    else 
     @items << CartItem.new(product_id) 
    end 
    end 

    def empty? 
    @items.empty? 
    end 

    def count 
    @items.length 
    end 

    def serialize 
    items = @items.map do |item| 
     { 
      "product_id" => item.product_id, 
      "quantity" => item.quantity 
     } 
    end 

    { 

      "items" => items 
    } 


    end 

    def total_price 
    @items.inject(0) { |sum, item| sum + item.total_price } 
    end 
end 

product.rb modèle

class Product < ActiveRecord::Base 

     mount_uploader :image, ImageUploader 

     validates_presence_of :name, :price, :stock_quantity 
     validates_numericality_of :price, :stock_quantity 

     belongs_to :designer 
     belongs_to :category 
     belongs_to :page 

     def self.search(query) 

     where("name LIKE ? OR description LIKE ?", "%#{query}%", "%#{query}%") 
     end 
    end 


`cart_controller.rb` 

class CartsController < ApplicationController 
    before_filter :initialize_cart 

    def add 
     @cart.add_item params[:id] 
     session["cart"] = @cart.serialize 
     product = Product.find params[:id] 
     redirect_to :back, notice: "Added #{product.name} to cart." 
    end 

    def show 

    end 

    def checkout 
     @order_form = OrderForm.new user: User.new 
     @client_token = Braintree::ClientToken.generate 
    end 

    def remove 
    cart = session['cart'] 
    item = cart['items'].find { |item| item['product_id'] == params[:id] } 
    if item 
    cart['items'].delete item 
    end 
    redirect_to cart_path 
    end 


end 

Répondre

1

Est-ce que l'ajout de cette ligne: product.update_columns(stock_quantity: product.stock_quantity - 1)

Pour votre action d'ajout dans le CartsController, faites l'affaire?

def add 
    @cart.add_item params[:id] 
    session["cart"] = @cart.serialize 
    product = Product.find params[:id] 

    product.update_columns(stock_quantity: product.quantity - 1) 

    redirect_to :back, notice: "Added #{product.name} to cart." 
end 

Essayez ceci pour retirer le produit du panier:

def remove 
     cart = session['cart'] 
     item = cart['items'].find { |item| item['product_id'] == params[:id] } 

     product = Product.find(item['product_id']) 
     product.update_columns(stock_quantity: product.stock_quantity + 1) 

     if item 
      cart['items'].delete item 
     end 
     redirect_to cart_path 
    end 

Remarque, cela ne fonctionnera que si vous ajoutez et la suppression 1 pièce/produit à la fois. Je suggère de renommer 'article' en 'produit' dans votre action de suppression pour la cohérence.

+0

Ohhhh ouais !!! merci beaucoup ça fonctionne, mais d'une certaine manière. Si j'ajoute un produit au panier, la quantité de stock diminue, mais si je retire ensuite le produit du panier, la quantité de stock ne remonte pas – DaudiHell

+1

Voir edit, une suggestion pour supprimer l'action – matthewalexander

+0

c'est une très bonne suggestion, mais il donne une erreur 'NoMethodError in CartsController # remove'. dire 'méthode non définie 'stock_quantity' pour {" product_id "=>" 14 "," quantité "=> 1}: Hash' dans cette ligne 'item = item.update_columns (stock_quantity: item.stock_quantity + 1)' – DaudiHell