Rails错误:nil的未定义方法`add_product':NilClass

时间:2016-04-19 11:04:34

标签: ruby-on-rails ruby ruby-on-rails-4 e-commerce

我对Rails很陌生,所以可能是我犯的一个愚蠢的错误,只需要有人指出它。

构建小型购物车应用。当我点击“添加到购物车”时,它会抛出此错误:

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

参数:

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

以下是代码:

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

购物车型号:

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

添加到购物车按钮:

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

提前致谢!

2 个答案:

答案 0 :(得分:1)

您尚未定义@cart实例变量并使用add_product LineItemsController方法访问其create方法。

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

答案 1 :(得分:0)

在您的代码中:

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

第[3]行,使用@cart,但@cart从未在它之前设置,因此它不知道它在那时是什么。

所以你需要在使用之前设置@cart。例如:

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

此外,您还需要更新代码:

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

to(如果此处存在cart个对象):

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