簡體   English   中英

增加購物車導軌中的重復項目 4

[英]Incrementing repeated items in cart rails 4

當我將商品添加到購物車時遇到問題,如果商品已存在,則不會更新它,而是創建一個重復的商品。 我知道我需要通過驗證來檢查 order_item 是否存在,但我不太確定如何或在何處執行此操作。

    class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  helper_method :current_order
  helper_method :current_buylist_order

  def current_order
    if !session[:order_id].nil?
      Order.find(session[:order_id])
    else
      Order.new
    end
  end
  end




class OrderItemsController < ApplicationController
  def create
    @order = current_order
    @order_item = @order.order_items.new(order_item_params)
    @order.save
    session[:order_id] = @order.id
  end

  def update
    @order = current_order
    @order_item = @order.order_items.find(params[:id])
    @order_item.update_attributes(order_item_params)
    @order_items = @order.order_items
  end

  def destroy
    @order = current_order
    @order_item = @order.order_items.find(params[:id])
    @order_item.destroy
    @order_items = @order.order_items
  end
private
  def order_item_params
    params.require(:order_item).permit(:quantity, :card_id)
  end
end

class CartsController < ApplicationController
  def show
    @order_items = current_order.order_items
  end
end

    class Order < ActiveRecord::Base
  belongs_to :order_status
  has_many :order_items
  before_create :set_order_status
  before_save :update_subtotal

  def subtotal
    order_items.collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum
  end

private

  def set_order_status
    self.order_status_id = 1
  end

  def update_subtotal
    self[:subtotal] = subtotal
  end 
end

class OrderItem < ActiveRecord::Base
  belongs_to :card
  belongs_to :order

  validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 }
  validate :card_present
  validate :order_present

  before_save :finalize

  def unit_price
    if persisted?
      self[:unit_price]
    else
      card.price
    end
  end

  def total_price
    unit_price * quantity
  end

private
  def card_present
    if card.nil?
      errors.add(:card, "is not valid or is not active.")
    end
  end

  def order_present
    if order.nil?
      errors.add(:order, "is not a valid order.")
    end
  end

  def finalize
    self[:unit_price] = unit_price
    self[:total_price] = quantity * self[:unit_price]
  end
end

OrderItemsController ,在createupdate方法中,您使用的行@order_item = @order.order_items.new(order_item_params)每次調用這些方法之一時都會初始化新項目。 您需要更改這些方法,因此它們僅在具有相同參數的項目不存在時才創建新項目。 看看first_or_initializefirst_or_create方法。 或者使用一個簡單的條件(例如,如果訂單中存在項目,則將數量增加一,否則創建新項目)

在您的 Order Items Controller 中,在 create 方法下,有一個代碼來檢查現有產品,如果您多次添加到購物車,則增加數量。 您也可以使用 jQuery 來禁用該按鈕。

在 order_items_controller 中的 create 方法下

@product_id = params['order_item']['product_id']
@order.order_items.each do |oi|
  if oi.product_id.to_s == @product_id
      updater(oi.id,params['order_item']['quantity']) and return
  end
end

添加和數量更新的額外方法

def updater(id,quantity)
    @order = current_order
    @order_item = @order.order_items.find(id)
    quantity = @order_item.quantity + quantity.to_i
    @order_item.update(quantity:quantity)
    @order_items = @order.order_items
end

對我有用的是:

def create
    @order = current_order
   if OrderItem.where("card_id = ? AND order_id = ?", 
             params[:order_item][:card_id], @order.id.to_s).empty?
      @order_item = OrderItem.new(order_item_params)
      @order_item.order = current_order
      @order_item.save
   else
      @order_item = OrderItem.where("card_id = ? AND order_id = ?", 
             params[:order_item][:card_id], @order.id.to_s).first
      quantity = @order_item.quantity += params[:order_item][:quantity].to_i
      @order_item.update(quantity: quantity)
   end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM