2011-08-04 21 views
2

私は、Agile Web Development with Rails(第4版)の書籍で作業しており、動作していないコードにぶつかりました。私はなぜそれが動作していないか把握するために努力しましたが、私はそれを作っていませんでした。LineItemsControllerのNoMethodError#create

その背景INFORMATION

次のクラスが関与している:NOW

class Cart < ActiveRecord::Base 
    has_many :line_items, :dependent => :destroy 
end 

class LineItem < ActiveRecord::Base 
    belongs_to :product 
    belongs_to :cart 
end 

class ApplicationController < ActionController::Base 
    protect_from_forgery 

    private 

    def current_cart 
    Cart.find(session[:cart_id]) 
    rescue ActiveRecord::RecordNotFound 
    cart = Cart.create 
    session[:cart_id] = cart.id 
    end 
end 

ここでそれが失敗したところである:

class LineItemsController < ApplicationController 
    def index 
    @line_items = LineItem.all` 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @line_items } 
    end 
    end 

    # GET /line_items/1 
    # GET /line_items/1.xml 
    def show 
    @line_item = LineItem.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @line_item } 
    end 
    end 

    # GET /line_items/new 
    # GET /line_items/new.xml 
    def new 
    @line_item = LineItem.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.xml { render :xml => @line_item } 
    end 
    end 

    # GET /line_items/1/edit 
    def edit 
    @line_item = LineItem.find(params[:id]) 
    end 

    # POST /line_items 
    # POST /line_items.xml 
    def create 
    @cart = current_cart 
    product = Product.find(params[:product_id]) 
    @line_item = **@cart.line_items.build(:product => product)**` 

エラーメッセージ * NoMethodError LineItemsController#で を作成定義されていないmeth 9用:Fixnumか Rails.root:/ホーム/ tmiskiew /デポ*

*アプリ/コントローラ/ line_items_controller.rb:53: `作成の」OD` line_items:= { "product_idの" リクエスト パラメータ> "4"、 "authenticity_token" => "dR4nL5zI + R7qIIPwNkl3EoaI1KyFWRokvh92m3PwD8o ="} *

誰でも@ cart.line_items.buildと間違って何のアイデア? 私はレール3.0.9とRuby 1.8.7

おかげ トーマス

答えて

2

を働いているこれは@cartは数ではなく、カートであることを述べている
undefined method line_items' for 9:Fixnum

あなたのエラーを見てくださいからrecordNotFoundして、rescueブロックを返す: Cart.find([cart_id]セッション)ため、オブジェクト(作成アクションから@cart = current_cart番号を返す)、
current_cart関数は、数値を返します機能が実行されます。

あなたが返されますので、cart.id

編集、Rubyですべての機能が最後に実行された行の結果を返すことに注意してください:最初のコメントについては、法に

 
    def current_cart 
     Cart.find(session[:cart_id]) 
     rescue ActiveRecord::RecordNotFound 
     cart = Cart.create 
     session[:cart_id] = cart.id 
     cart # this will get returned 
     end 
    end 
+0

あなたは、私がリターンセッションでcurrent_cartの他の枝を完了する必要があり意味するかに移行?私はそれを試みましたが、今はSQLite3 :: BusyExceptionを取得しています:データベースがロックされています:INSERT INTO "カート"( "updated_at"、 "created_at")VALUES( '2011-08-04 07:51:23.552125'、 '2011 -08-04 07:51:23.552125 ') – Thomas

+0

カートの代わりにセッションを返すのは、次のコードのためです: 'respond_to do | format | if @ line_item.save format.html {redirect_to(@ line_item.cart、 :notice => '広告申込情報が正常に作成されました。')} format.xml {render:xml => @line_item、 :status = >:created::location => @line_item} else format.html {render:action => "new"} format.xml {render:xml => @ line_item.errors、 :status =>:unprocessable_entity} end end' – Thomas

+0

あなたは 'cart'を返すことができ、' @cart = current_cart'のようにセッション[:cart_id]に入れたものを使用して '@ cart.id'を呼び出すことができます。これはsession [:cart_id](セッションcart.idに入れた後) – cristian

2

を書き換えるしようとするが、ここにありますどのように私はそれを固定...あなたのためにも動作することを願っています。

/app/models/cart.rb:

def add_product(product_id) 
    current_item = line_items.find_by_product_id(product_id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = line_items.build(:product_id => product_id) 
    end 
    return current_item 
end 

でリターンを追加します。これが失敗した理由を、私は100%わからないんだけど、私は機能だけではなく、数量を返すと思います。 ifステートメントがtrueと評価されない限り、広告申込情報よりも優先されます。このヘルプを願っています... Destoryは...、それは未定義のメソッドを引き起こす:中

class Cart < ActiveRecord::Base 
    has_many :line_items, :dependent => :destroy 
end 

タイプミス:

0

私は、同様のエラーを持っている、それは私がCart.rbにタイプミスがあり判明します。

0

私は同じ問題を抱えていました。私は本当にそれに固執していました。 データベースをロールバックしてもう一度移行することで修正しました。端末上

コマンド:

  • すくいデシベル:
  • すくいデシベルをロールバック: