ActionController :: RoutingError(未定义的局部变量或方法`current_order' for OrderItemsController:Class):

时间:2016-06-26 21:36:25

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

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

我现在在我的日志中收到此错误:

ActionController::RoutingError (undefined local variable or method current_order' for OrderItemsController:Class): app/controllers/order_items_controller.rb:15:in <class:OrderItemsController>' app/controllers/order_items_controller.rb:1:in `<top (required)>''

相关代码:

order_items_controller.rb

class OrderItemsController < ApplicationController
 def create
     @item = OrderItem.new(order_item_params)
  session[:order_id] = current_order.id

  if @item.save
    respond_to do |format|
      format.js { flash[:notice] = "ORDER HAS BEEN CREATED." } 
    end
  else
    redirect_to root_path
  end 
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
private

  def order_item_params
  base_params = params.require(:order_item)
                      .permit(:quantity, :product_id, :user_id)
  base_params.merge(order: current_order)
 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
validate :only_3_items_in_30_days

  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



  def only_3_items_in_30_days
    now = Date.new
    days_since_first = now - order.first_item_added_at

    if order.order_items.count > 2 && days_since_first < 30
      errors.add(:base, 'only 3 items in 30 days are allowed')
    end
    true      # this is to make sure the validation chain is not broken in case the check fails
  end



end

正在提交的表格:

<%= form_for OrderItem.new,  html: {class: "add-to-cart"}, remote: true do |f| %>


        <div class="input-group">
          <%= f.hidden_field :quantity, value: 1, min: 1 %>
          <div class="input-group-btn">
            <%= f.hidden_field :product_id, value: product.id %>
            <%= f.submit "Add to Cart", data: { confirm: 'Are you sure that you want to order this item for current month?'}, class: "btn btn-default black-background white" %>
          </div>
        </div>
      <% end %>
    </div>

1 个答案:

答案 0 :(得分:0)

您在哪里设置current_order

class OrderItemsController < ApplicationController
 def create
     @item = OrderItem.new(order_item_params)
  session[:order_id] = current_order.id

  if @item.save
    respond_to do |format|
      format.js { flash[:notice] = "ORDER HAS BEEN CREATED." } 
    end
  else
    redirect_to root_path
  end 
end

# I have no idea of what this method ought to accomplish could you try to explain? but this is the immediate cause of the error. There could be others though.
def method_wrapper
  @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
private

  def order_item_params
    base_params = params.require(:order_item)
                      .permit(:quantity, :product_id, :user_id)
    base_params.merge(order: current_order)
  end
end