2017-03-10 48 views
1

我正在一個在線的Web開發類,不幸的是教師未回覆電子郵件。在此任務中,我嘗試爲我的購物車創建結帳屏幕時遇到了錯誤。事情是,教授也懶得檢查他的代碼,看看它是否工作,所以我沒有正確的解決方案來參考。我假設這本書可能存在問題,因爲看起來其他人也有類似的問題。NoMethodError在OrderController#新

我與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

@cart對象是nil,所以當你嘗試調用line_items(L,73),你會得到一個錯誤,因爲未包括在該方法NilClass

所以似乎@cart尚未初始化。我需要看到整個OrderController代碼更加準確,但可能是ensure_cart_isnt_empty方法需要對象被一些before_filter方法來初始化。或者,也許數據庫沒有返回任何東西。

編輯:

看你的代碼後,我認爲這個問題是在下面幾行:

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

請注意,before方法是順序執行,所以當執行ensure_cart_isnt_empty@cart未初始化。您需要進行如下更改:

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我剛更新了我的回覆:) –