对不起,如果这是一个愚蠢的问题,真的我是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
有什么建议吗?你能看出什么问题吗? 谢谢
答案 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,但是,正如另一个回答者所说,它应该告诉你哪一行包含错误(如果不是确切的语法)。