2016-07-23 2 views
-1

Ich habe ein Problem, wenn ich Artikel in meinen Einkaufswagen hinzufüge. Anstatt einen Artikel zu aktualisieren, wenn er bereits vorhanden ist, wird ein doppelter Artikel erstellt. Ich weiß, dass ich eine Bestätigung übergeben muss, um zu überprüfen, ob das order_item existiert, aber ich bin nicht ganz sicher, wie oder wo es zu tun ist.Wiederholte Objekte in Wagenschienen inkrementieren 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

Ich schlage vor, Sie stellen eine präzise Frage. Sie können nicht erwarten, dass jeder Ihren Code liest und versteht. – aBadAssCowboy

Antwort

0

In Sie OrderItemsController, in create und update Methoden, die Sie Linie verwenden @order_item = @order.order_items.new(order_item_params), die jedes Mal eine dieser Methoden neues Objekt initialisiert wird aufgerufen. Sie müssen diese Methoden ändern, damit sie nur dann neue Elemente erstellen, wenn das Element mit den gleichen Parametern noch nicht existiert. Schauen Sie sich first_or_initialize oder first_or_create Methode. Oder verwenden Sie eine einfache Bedingung (zB wenn Artikel in der Reihenfolge vorhanden ist, erhöhen Sie die Menge um eins, sonst erstellen Sie einen neuen Artikel)