2017-03-10 25 views
1

Ich nehme eine Online-Webentwicklungsklasse und der Lehrer reagiert leider nicht auf E-Mails. Während dieser Aufgabe tritt ein Fehler auf, wenn ich versuche, einen Checkout-Bildschirm für meinen Einkaufswagen zu erstellen. Die Sache ist, der Professor hat sich auch nicht die Mühe gemacht, seinen Code zu überprüfen und zu sehen, ob es funktioniert, also habe ich keine richtige Lösung zum Nachschlagen. Ich nehme an, dass es ein Problem mit dem Buch geben könnte, da es scheint, dass andere ähnliche Probleme haben.NoMethodError in OrderController # neu

Ich bin ein totaler Noob mit Rubyronrails, also suche ich nach etwas Hilfe, um die Ursache dieses Fehlers zu finden.

Ich kann deutlich die NoMethodError in OrderController#new sehen. Aber habe keine Ahnung, was das bedeutet, dass ich tun sollte.

Jede Anleitung für mich?

error

order_controller.rb

class OrdersController < ApplicationController 
    include CurrentCart 
    before_action :ensure_cart_isnt_empty, only: :new 
    before_action :set_cart, only: [:new, :create] 
    before_action :set_order, only: [:show, :edit, :update, :destroy] 

    # GET /orders 
    # GET /orders.json 
    def index 
    @orders = Order.all 
    end 

    # GET /orders/1 
    # GET /orders/1.json 
    def show 
    end 

    # GET /orders/new 
    def new 
    @order = Order.new 
    end 

    # GET /orders/1/edit 
    def edit 
    end 

    # POST /orders 
    # POST /orders.json 
    def create 
    @order = Order.new(order_params) 
    @order.add_line_items_from_cart(@cart) 
    respond_to do |format| 
     if @order.save 
     Cart.destroy(session[:cart_id]) 
     session[:cart_id] = nil 
     format.html { redirect_to store_index_url, notice:'Thank you for your order.' } 
     format.json { render :show, status: :created, location: @order } 
     else 
     format.html { render :new } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /orders/1 
    # PATCH/PUT /orders/1.json 
    def update 
    respond_to do |format| 
     if @order.update(order_params) 
     format.html { redirect_to @order, notice: 'Order was successfully updated.' } 
     format.json { render :show, status: :ok, location: @order } 
     else 
     format.html { render :edit } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /orders/1 
    # DELETE /orders/1.json 
    def destroy 
    @order.destroy 
    respond_to do |format| 
     format.html { redirect_to orders_url, notice: 'Order was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    def ensure_cart_isnt_empty 
    if @cart.line_items.empty? 
     redirect_to store_index_url, notice: 'Your cart is empty' 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_order 
     @order = Order.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def order_params 
     params.require(:order).permit(:name, :addresss, :email, :pay_type) 
    end 

end 

Antwort

4

Das @cart Objekt ist nil, so dass, wenn Sie versuchen, line_items zu nennen (l. 73) erhalten Sie einen Fehler, weil das Verfahren nicht inbegriffen auf die NilClass.

So scheint es, dass die @cart wurde nicht initialisiert. Ich müsste den ganzen OrderController Code genauer sehen, aber wahrscheinlich erwartet die ensure_cart_isnt_empty Methode, dass das Objekt durch irgendeine before_filter Methode initialisiert wird. Oder vielleicht gibt die Datenbank nichts zurück.

Edit:

Nachdem in Ihrem Code suchen, denke ich, das Problem in den folgenden Zeilen ist:

before_action :ensure_cart_isnt_empty, only: :new 
    before_action :set_cart, only: [:new, :create] 

Bitte beachten Sie, dass before Methoden in dieser Reihenfolge ausgeführt werden, so dass, wenn ensure_cart_isnt_empty ausgeführt wird, @cart ist nicht initialisiert. Sie würden es ändern müssen, wie folgt:

before_action :set_cart, only: [:new, :create] 
    before_action :ensure_cart_isnt_empty, only: :new 

So set_car zuerst ausgeführt wird und ensure_cart_isnt_empty ein gültiges Objekt finden.

+0

Aktualisierung mit mehr Code für Sie – 23k

+0

Code wurde hinzugefügt. – 23k

+0

@ 23k Ich habe gerade meine Antwort aktualisiert :) –