2017-03-10 1 views
1

온라인 웹 개발 클래스를 사용하고 있으며 불행히도 강사가 전자 메일에 응답하지 않습니다. 이 과제를 수행하는 동안 장바구니에 대한 결제 화면을 만들려고 할 때 오류가 발생합니다. 문제는 교수님도 코드를 확인하고 작동하는지 확인하지 않으므로 참조 할 올바른 해결책이 없습니다. 다른 사람들이 비슷한 문제를 겪고있는 것처럼 책에 문제가있는 것으로 가정합니다.OrderController의 NoMethodError # new

저는 rubyonrails에서 멍청한 놈입니다. 그래서이 오류의 원인을 찾아야 할 도움이 필요합니다.

나는 분명히 NoMethodError in OrderController#new을 볼 수 있습니다. 그러나 그것이 내가 무엇을해야한다는 것을 의미하는지 모른다.

나에게 어떤 안내가 있습니까?

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 

답변

4

그 방법에 포함되어 있지 않기 때문에 당신이 오류가 line_items (리터. 73)를 호출하려고하면 @cart 개체가 너무, nil입니다 NilClass.

따라서 @cart이 초기화되지 않은 것처럼 보입니다. 좀 더 정확하려면 전체 OrderController 코드를 볼 필요가 있지만, 아마도 ensure_cart_isnt_empty 메서드는 어떤 before_filter 메서드로 초기화 될 개체를 기다리고있을 것입니다. 아니면 데이터베이스가 아무것도 반환하지 않습니다.

편집 :

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

, 그래서 ensure_cart_isnt_empty 실행, @cartbefore 방법을 순서대로 실행됩니다 있습니다 :

코드보고 후, 나는 문제가 다음 줄에 생각 초기화되지 않았습니다.

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

그래서 set_car 먼저 실행되고 ensure_cart_isnt_empty 유효한 객체를 찾을 수 있습니다 : 당신은 다음과 같이 변경해야합니다.

+0

더 많은 코드로 업데이트합니다. – 23k

+0

코드가 추가되었습니다. – 23k

+0

@ 23k 방금 업데이트했습니다. 내 답변 : –