将order_items的数量限制为订单时的问题

时间:2016-06-27 09:53:42

标签: ruby-on-rails ruby model-view-controller

我在Rails中建立一个具有特定销售模式的商店。我需要允许用户每30天只向其订单添加3个项目。 30天计数器应该在添加第一个order_item时开始。一旦30天到期,用户将能够添加3个订单。如果30天没有通过,例如,用户添加两个ord​​er_items,他仍然可以在30天内再添加一个order_item。因此,如果用户尝试添加超过3个项目以显示错误消息,并忽略将order_items保存为current_user的顺序。

所以我做了什么: 我在用户模型中添加了一个begin_date和一个order_counter。每次添加订单时,要查看begin_date是否超过30天,请将begin_date设置为实际日期。如果begin_date小于30天前,则增加计数器。如果计数器已经3拒绝订单。

问题: 我可以看到Order_Counter在我的rails admin中位于第3位。但是,我仍然可以为用户的订单添加无限的order_items。 做错了什么?

class OrderItemsController < ApplicationController
 def create
    now = Date.today
  if current_user.begin_date && ((now - 30) < current_user.begin_date)
     if current_user.order_counter >= 3
        redirect_to root_path
     else
       current_user.order_counter += 1
       current_user.save
     end
  else 
    current_user.order_counter = 1
    current_user.begin_date = now
    current_user.save
  end


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

@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


end

order_item.rb

class OrderItem < ActiveRecord::Base
  belongs_to :product
  belongs_to :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
  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

0 个答案:

没有答案