【问题标题】:How to keep same order on each session?如何在每个会话中保持相同的顺序?
【发布时间】:2023-03-05 06:33:01
【问题描述】:

我正在 Rails 中的一家商店工作。由于我是 Rails 新手,因此我正在关注一些关于如何创建购物车和订购系统的教程。

因此,现在用户会在每次新会话中将 order_item 添加到购物车时自动创建和保存具有唯一 ID 的订单。这就是问题所在。

我希望订单持续到 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

用户.rb

has_many :order

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案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
    

    【讨论】:

    • 在 application_controller.rb 中定义,如下所示: helper_method :current_order def current_order if !session[:order_id].nil? Order.find(session[:order_id]) else Order.new end end
    • 好的,我不确定session[:order_id] 的来源,但也许您想将其更改为Order.find(session[:order_id]) || Order.find_by_user_id(current_user.id)。这段代码是你自己写的吗?你会编程吗?
    • 不,我自己没有写它来自本教程:richonrails.com/articles/…
    • 只有离开才能工作: Order.find_by_user_id(current_user.id) 。我现在知道了。谢谢!!
    猜你喜欢
    • 2012-06-05
    • 2020-11-01
    • 2020-03-31
    • 2019-02-19
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多