2016-07-23 32 views
-1

我在將項目添加到購物車時出現問題,而不是在項目已更新的情況下更新,因此會創建重複項目。我知道我需要通過驗證來檢查order_item是否存在,但我不太確定如何或在哪裏執行。在購物車導軌中增加重複項目4

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 
+0

我建議你提出一個精確的問題。你不能指望每個人都閱讀和理解你的代碼。 – aBadAssCowboy

回答

0

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