2016-06-26 5 views
-1

Ich baue eine Filiale in Rails, die ein bestimmtes Verkaufsmodell hat. Ich muss einem Benutzer erlauben, nur 3 Artikel zu seiner Bestellung pro 30 Tage hinzuzufügen. Der 30-Tage-Zähler sollte mit dem ersten order_item beginnen. Nach Ablauf von 30 Tagen kann der Benutzer 3 Bestellungen hinzufügen. Wenn 30 Tage nicht bestanden haben, und als Beispiel, fügt der Benutzer zwei order_items hinzu, die er innerhalb von 30 Tagen noch einen weiteren order_item hinzufügen kann. Auch wenn der Benutzer versucht, mehr als 3 Elemente hinzuzufügen, um eine Fehlermeldung anzuzeigen und das Speichern der order_items in der Bestellung von current_user zu ignorieren.ActionController :: RoutingError (undefinierte lokale Variable oder Methode `current_order 'für OrderItemsController: Class):

Ich erhalte diesen Fehler in meinem Log jetzt:

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)>'' 

Relevante Codes:

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 

Und formt das ich s wird übermittelt:

<%= 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> 

Antwort

0

Wo stellen Sie Ihre current_order ein?

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 
Verwandte Themen