2016-07-23 10 views
-1

カートにアイテムを追加するときに問題が発生します。アイテムがすでに存在する場合は更新する代わりに、アイテムが重複して作成されます。私はorder_itemが存在するかどうかを確認するために検証を渡す必要があることを知っていますが、どうやってそれをやるべきかはわかりません。あなたは新しいアイテムにこれらの方法のいずれかが呼び出されるたびに初期化する行@order_item = @order.order_items.new(order_item_params)を使用しているcreateupdate方法であなたOrderItemsControllerカートレールの繰返しアイテムを増やす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

、。これらのメソッドを変更する必要があるため、同じパラメータを持つアイテムが存在しない場合にのみ新しいアイテムを作成します。 first_or_initializeまたはfirst_or_createメソッドを見てください。または、単純な条件を使用してください(例:注文数量が1つ増えている場合は新しい項目を作成します)

関連する問題