2016-06-28 55 views
0

我正在使用rails的商店。由于我是Rails的新手,我正在关注如何创建购物车和订购系统的一些教程。如何在每个会话上保持相同的顺序?

所以,现在订单中带有唯一标识符的订单正在由用户自动创建并保存,每次新建会话时都会向订单中添加一个order_item。这是问题。

我想要订单持续到30天过去(首先创建的一个订单,即用户添加第一个order_item时)。问题在于:因此,如果用户添加order_items,他创建一个订单,然后注销并返回,并将新的order_item添加到他的购物车中,即使已将旧订单保存到数据库中,也会创建新订单。我想检索第一个订单。

你能告诉我如何做到这一点吗?

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

我希望检索一阶。

这条线:

@order = current_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:current_order'高清current_order 如果会话![:ORDER_ID] .nil? Order.find(会话[:ORDER_ID]) 其他 Order.new 结束 end' –

+1

好吧,我不知道在哪里'会话[:ORDER_ID]'是从哪里来的,但也许你想要将其更改为'Order.find(session [:order_id])|| Order.find_by_user_id(current_user.id)'。你自己写了这些代码吗?你知道如何编程吗? – jrochkind

+0

不,我不是自己写的,它是从这个教程:https://richonrails.com/articles/building-a-shopping-cart-in-ruby-on-rails –

相关问题