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
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
Voir edit, une suggestion pour supprimer l'action – matthewalexander
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