2016-04-19 11 views
0

Ich bin ziemlich neu in Rails, also könnte ein dummer Fehler sein, den ich mache und nur jemanden brauche, um darauf hinzuweisen.Rails Error: Undefinierte Methode `add_product 'für nil: NilClass

Aufbau einer kleinen Einkaufswagen App. Wenn ich auf 'In den Warenkorb', wirft er diesen Fehler auf:

NoMethodError in LineItemsController#create 
undefined method `add_product' for nil:NilClass 

Parameter:

{"authenticity_token"=>"uZ6zOfA237VBzt3Pz2tEBESzjv2pg+Vhx73DTolL8f76ANS80qiU6+wcN8Tvq/r+CSZvzxnkKll/ZJl2H2XePQ==", 
"product_id"=>"1"} 

Hier ist der Code:

line_items_controller

def create 
    product = Product.find(params[:product_id]) 
    @line_item = @cart.add_product(product.id) 

    respond_to do |format| 
     if @line_item.save 
     format.html { redirect_to customer_cart_path } 
     format.json { render :show, status: :created, location: @line_item } 
     else 
     format.html { render :new } 
     format.json { render json: @line_item.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

Wagen Modell:

class Cart < ActiveRecord::Base 
has_many :line_items, dependent: :destroy 
belongs_to :user 

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 
    current_item 
end 

def total_price 
    line_items.to_a.sum { |item| item.total_price } 
end 
end 

in der Warenkorb Button:

<%= button_to 'Add to Cart', line_items_path(product_id: product) %> 

Vielen Dank im Voraus!

+0

Die '@ car' Variable ist 'nil', wo ist es definiert? –

Antwort

0

In Ihrem Code:

def create 
product = Product.find(params[:product_id]) 
@line_item = @cart.add_product(product.id) 

line [3], verwendet @cart, aber @cart wurde, bevor es nie so eingestellt, dass sie nicht weiß, was es an diesem Punkt ist.

Sie müssen also @cart vor der Verwendung einstellen. Ex:

@cart = Cart.find(params[:cart_id]

Außerdem müssen Sie den Code aktualisieren:

<%= button_to 'Add to Cart', line_items_path(product_id: product) %> 

an (wenn Ihr cart Objekt existiert hier):

<%= button_to 'Add to Cart', line_items_path(product_id: product, cart_id: cart) %> 
+0

Danke für Ihre Antwort - '<% = render partially: "line_items/line_item", Sammlung: (at) cart.line_items%>' - Diese Zeile wirft einen Fehler in der Ansicht auf. Der Fehler ist: undefined Methode 'line_items' für nil: NilClass –

+0

Das bedeutet, dass das @ cart-Objekt wieder nicht gesetzt ist. Ich nehme an, dass wir jetzt in der SHOW Aktion im Controller sind oder so ähnlich. Also, in der Definition dieser Aktion in der Steuerung, legen Sie den Wert von @ Warenkorb –

+0

Danke für Ihre Antwort noch einmal. Du hast Recht, aber ich habe das in der Show-Aktion || Klasse Kunden :: CartsController

1

Sie haben Ihre @cart Instanzvariable nicht definiert und greifen auf ihre add_product Methode in Ihrer LineItemsController 's create Methode zu.

@line_item = @cart.add_product(product.id) # <== HERE 
+0

dachte, es war das 'add_product', das war null? –

Verwandte Themen