带有nil对象的NoMethodError

时间:2011-04-15 18:31:51

标签: ruby-on-rails ruby ruby-on-rails-3

对不起,如果这是一个愚蠢的问题,真的我是ROR世界的新手,我正在努力学习。

我正在阅读使用Rails电子书的Agile Web Develpment,并按照书籍计划我收到了这个错误:

   Line ItemsController #crera

中的NoMethodError      

当你没想到它时,你有一个零对象!   您可能期望一个Array实例。   评估nil时发生错误。

这是购物车模型

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

  def add_product(product_id)
    current_item = line_items.where(:product_id => product_id).first
    if current_item
      current_item.quantity += 1
    else
      current_item = LineItem.new(:product_id => product_id)
      line_items << current_item
    end
    current_item
  end
end

这是Line Item控制器,该方法被称为

  def create
    @cart = current_cart
    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(@line_item.cart, :notice => 'Line item was successfully created.') }
        format.xml  { render :xml => @line_item.cart, :status => :created, :location => @line_item }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @line_item.errors, :status => :unprocessable_entity }
      end
    end
  end

Rails版本3.0.5 Ruby版本1.8.7

有什么建议吗?你能看出什么问题吗? 谢谢

3 个答案:

答案 0 :(得分:2)

当它在nil对象上报告NoMethodError时,表示您调用方法的对象不存在。在这里,可能是@cart@line_item没有数据,具体取决于发生错误的行号。所以可能是那个

@cart = current_cart

...或...

@line_item = @cart.add_product(product.id)

未返回有效对象。看看那些方法。

答案 1 :(得分:1)

问题是你正在调用方法的对象是nil。错误消息上应该有一个行号,该行号应指向导致问题的有问题的代码行。

只是一个猜测,但current_cart可以返回零吗?这将是我最初的预感,但如果您能突出显示错误原因的哪一行,那将会有所帮助。

答案 2 :(得分:0)

NoMethodError表示您正在调用一个方法,该方法没有为您调用方法的类的实例定义,在这种情况下,您尝试调用方法的对象的类for是NilClass。如果你不确定哪个对象是nil,你总是可以用obj.class来询问irb,但是,正如另一个回答者所说,它应该告诉你哪一行包含错误(如果不是确切的语法)。