2016-06-28 12 views
0

私はレールの店で働いています。私がRailsを使い慣れていないので、私はショッピングカートと注文システムの作成方法に関するチュートリアルに従っていました。各セッションで同じ注文を維持するには?

これで、新しいセッションごとにorder_itemをカートに追加すると、一意のIDを持つ注文が作成され、ユーザーによって自動的に保存されます。これが問題です。

30日が経過するまで(最初に作成された注文、つまり、ユーザーによって最初のorder_itemが追加されたとき)、注文を維持したいと考えています。問題は次のとおりです。つまり、ユーザーがorder_itemsを追加すると、注文を作成してからログアウトして戻って新しい注文アイテムをカートに追加すると、すでに古い注文がデータベースに保存されていても新しい注文が作成されます。私はその最初の注文を取得したい。

どうすればいいですか?

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

    respond_to do |format| 
    format.js { flash[:notice] = "ORDER ITEM HAS BEEN ADDED." } 
    end 
    end 

order_item.rb

class OrderItem < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :order 
    validates_associated :order 
    validates :quantity, presence: true, numericality: { only_integer: true, greater_than: 0 } 
    validate :product_present 
    validate :order_present 


    before_save :finalize 

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

    def total_price 
    unit_price * quantity 
    end 

private 
    def product_present 
    if product.nil? 
     errors.add(:product, "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 

order.rb

class Order < ActiveRecord::Base 
    belongs_to :order_status 
    belongs_to :user 
    has_many :order_items 
    validates_length_of :order_items, maximum: 3 
    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 

user.rb

has_many :order 

答えて

1

私はその最初の注文を取得します。

この行:current_orderを定義している

@order = current_order

?新しい注文を作成するのではなく、既存の注文がある場合は、その注文を検索する必要があります。ような何か:

def current_order 
    order = Order.find_by_user_id(current_user.id) 
    if order.nil? 
     order = Order.create (...etc) 
    end 
    order 
end 
+0

は、それはapplication_controller.rbで定義され、それがこのようになりますされていますhelper_method:!の[:ORDER_ID] .nilセッション場合 'DEF をcurrent_order current_order? Order.find(セッション[:ORDER_ID]) 他 Order.new エンド end' –

+1

さて、私は 'セッションの場所がわからないんだけど[:ORDER_ID]'から、多分あなたはそれを変更したいれます'Order.find(セッション[:order_id])|| Order.find_by_user_id(current_user.id) '。このコードを自分で書いたのですか?あなたはプログラムする方法を知っていますか? – jrochkind

+0

いいえ私はそれをこのチュートリアルから自分で書いていない:https://richonrails.com/articles/building-a-shopping-cart-in-ruby-on-rails –

関連する問題