2016-07-05 6 views
1

전자 상거래 앱을 개발 중이며 사용자가 장바구니에 제품을 추가 할 때 제품 재고 수량을 업데이트 할 수있는 방법을 모르겠습니다. 나는 총 초보자이기 때문에이 응용 프로그램의 대부분에 대한 자습서를 따랐다. 그러나 사용자가 장바구니에 제품을 추가 할 때 제품 재고량을 업데이트하는 방법에 대한 자습서는 제공되지 않습니다.레일 앱의 장바구니 수량을 기준으로 재고 수량 업데이트 중?

지금까지 나는 cart.rb 모델에이 방법을 추가 한

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

그러나 미안 정말 붙어 내가 을 누군가가 봐 수 있다면 그것은 좋은 것 뭘하는지 모른다 이 부분을 읽고 앱에이 기능을 구현하는 방법을 알려주세요. 여기

는 github의의의 repo 내가 지금 무엇을 https://github.com/DadiHall/brainstore

이에 대한 링크입니다.

cart_item.rb 모델

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 

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 모델

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 

답변

1

합니까이 줄을 추가 : product.update_columns(stock_quantity: product.stock_quantity - 1)

Add to CartsController에서 트릭을 수행 하시겠습니까?

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 

은 카트에서 제품을 제거하기위한이 시도 : 당신이 추가 한 번에 1 개 항목/제품을 제거하는 경우
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 

, 이것은에만 작동합니다. 일관성을 위해 제거 작업에서 '제품'으로 '항목'의 이름을 바꾸는 것이 좋습니다.

+0

Ohhhh 예! 너무 많이 작동하지만 고맙습니다. 장바구니에 제품을 추가하면 재고 수량이 줄어들지 만 장바구니에서 제품을 제거하면 재고 수량이 다시 올라 가지 않습니다 – DaudiHell

+1

편집을 참조하십시오. 제거 작업에 대한 제안 – matthewalexander

+0

아주 좋은 제안이지만 'NoMethodError in CartsController # remove' 오류를줍니다. { "product_id"=> "14", "quantity"=> 1}에 대해 '정의되지 않은 메소드'stock_quantity '를 말함 :이 라인에서 해시'item = up.questity (item_quantity : item.stock_quantity +1)' – DaudiHell