2013-07-23 135 views
0

我目前正在經歷「敏捷Web開發使用Rails - 第4版」,我被卡住。 結賬按鈕爲我們帶來了一個訂單頁面,而是我得到這個錯誤:爲什麼我收到「No Method」錯誤?

NoMethodError in Orders#new 

Showing C:/Sites/depot/app/views/orders/_form.html.erb where line #1 raised: 

undefined method `model_name' for NilClass:Class 
Extracted source (around line #1): 

1: <%= form_for(@order) do |f| %> 
2: <% if @order.errors.any? %> 
3:  <div id="error_explanation"> 
4:  <h2><%= pluralize(@order.errors.count, "error") %> 

花了很多時間試圖弄清楚這一點之後,我複製從書本網站的所有源代碼,這仍然沒有工作。我甚至查看了勘誤表和圖書論壇,卻什麼都沒發現。

我在做什麼錯?

這是從視圖/命令/ _form.html.erb代碼:

<%= form_for(@order) do |f| %> 
    <% if @order.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@order.errors.count, "error") %> 
     prohibited this order from being saved:</h2> 
     <ul> 
     <% @order.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 
    <div class="field"> 
    <%= f.label :name %><br /> 
<!-- START_HIGHLIGHT --> 
    <%= f.text_field :name, size: 40 %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="field"> 
    <%= f.label :address %><br /> 
<!-- START_HIGHLIGHT --> 
    <%= f.text_area :address, rows: 3, cols: 40 %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="field"> 
    <%= f.label :email %><br /> 
<!-- START_HIGHLIGHT --> 
    <%= f.email_field :email, size: 40 %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="field"> 
    <%= f.label :pay_type %><br /> 
<!-- START_HIGHLIGHT --> 
    <%= f.select :pay_type, Order::PAYMENT_TYPES, 
        prompt: 'Select a payment method' %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="actions"> 
<!-- START_HIGHLIGHT --> 
    <%= f.submit 'Place Order' %> 
<!-- END_HIGHLIGHT --> 
    </div> 
<% end %> 

這是訂單控制器:

class OrdersController < ApplicationController 
    def index 
    @orders = Order.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @orders } 
    end 
    end 

    # GET /orders/1 
    # GET /orders/1.json 
    def show 
    @order = Order.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @order } 
    end 
    end 

    # GET /orders/new 
    # GET /orders/new.json 
    def new 
    @cart = current_cart 
    if @cart.line_items.empty? 
     redirect_to store_url, notice: "Your cart is empty" 
     return 
    end 

    @order = Order.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @order } 
    end 
    end 

    # GET /orders/1/edit 
    def edit 
    @order = Order.find(params[:id]) 
    end 

    # POST /orders 
    # POST /orders.json 
    def create 
    @order = Order.new(params[:order]) 
    @order.add_line_items_from_cart(current_cart) 

    respond_to do |format| 
     if @order.save 
     Cart.destroy(session[:cart_id]) 
     session[:cart_id] = nil 
     format.html { redirect_to store_url, notice: 
      'Thank you for your order.' } 
     format.json { render json: @order, status: :created, 
      location: @order } 
     else 
     @cart = current_cart 
     format.html { render action: "new" } 
     format.json { render json: @order.errors, 
      status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /orders/1 
    # PUT /orders/1.json 
    def update 
    @order = Order.find(params[:id]) 

    respond_to do |format| 
     if @order.update_attributes(params[:order]) 
     format.html { redirect_to @order, notice: 'Order was successfully updated.' } 
     format.json { head :ok } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /orders/1 
    # DELETE /orders/1.json 
    def destroy 
    @order = Order.find(params[:id]) 
    @order.destroy 

    respond_to do |format| 
     format.html { redirect_to orders_url } 
     format.json { head :ok } 
    end 
    end 
end 

這是訂貨型號:

class Order < ActiveRecord::Base 
    PAYMENT_TYPES = [ "Check", "Credit card", "Purchase order" ] 

    has_many :line_items, dependent: :destroy 
    # ... 

    validates :name, :address, :email, presence: true 
    validates :pay_type, inclusion: PAYMENT_TYPES 
end 
+0

如果'form'包括在'new'視圖的部分,你在當地的傳遞,也許可以作爲'order'訪問,VS'@ order'? –

+0

您沒有@order。 –

+0

@DaveNewton請您詳細說明一下嗎?對不起,我是很新的編程 –

回答

0

form觀點認爲,@ordernil這裏:

1: <%= form_for(@order) do |f| %> 

你在瀏覽器中打的路徑是什麼? /orders/new

確實出現Order#new設置爲@orderOrder.new,所以我想知道你是否真的打了那個控制器。

Rails會請求路由到基於控制器的動作是什麼設置在routes.rb。運行rake routes查看可以在url中訪問的路線。

Rails有約定,例如,如果你使用一個簡單的GET請求訪問/orders/new,它將路由請求發往OrdersControllernew行動,將試圖使相關app/views/orders/new.html.erb - 除非你自定義的這一些方面。

我會在@order = Order.new分配之後的new操作中添加一個puts "Order is set to: #{@order}"以確保它實際上經歷了該路徑。

+0

這是路徑:http:// localhost:3000/orders/new? –

+0

冉耙路線測試和訂單/新是其中一條可用路線,如果這就是你問的?我還添加了你告訴我的代碼,並沒有發生任何事情。 –

+0

好的,所以當你點擊'localhost:3000/orders/new'它在終端上顯示的是什麼?應該有指示哪個控制器處理請求。 –

相關問題