我在rails中创建一个简单的购物车,当我将产品添加到购物车时,我收到此错误: 当你没想到它时,你有一个零对象!
添加到购物车的方法是:
def add_to_cart
begin
product = Product.find(params[:id])
rescue ActiveRecord::RecordNotFound
logger.error("Attemp to access invalid product #{params[:id]}")
flash[:notice] = "Invalid Product !"
redirect_to :action => :index
else
@cart = find_cart
@cart.add_product(product)
end
end
和购物车中的add_product:
def add_product(product)
current_item = @items.find {|item| item.product == product}
if current_item
current_item.increment_quantity
else
@items << CartItem.new(product)
end
end
购物车工作正常,当我将救援方法添加到add_to_cart这发生了......
答案 0 :(得分:0)
也许begin开始一个新的范围,以便产品var是本地的。 然后,当您在救援区中添加产品时,它是Nil的新本地。
要测试这个理论,只需在整个开始之前添加product = nil
,救援代码块
答案 1 :(得分:0)
我猜这不是范围问题,正如下面的irb测试所示:
irb(main):001:0> begin
irb(main):002:1* product = 'abc'
irb(main):003:1> rescue Exception => ex
irb(main):004:1> nil
irb(main):005:1> else
irb(main):006:1* puts product.inspect
irb(main):007:1> end
IMO的最佳解决方法是使用LOGGER.debug "product now contains #{product.inspect}"
在查找后立即找出产品中的内容。
您的回溯也会提供信息。在这一点上,很难说口译员在抱怨什么。可能是产品是零,但同样容易,它可能是@cart或您视图中引用的东西。
答案 2 :(得分:0)
如何定义add_product方法中的@items?我在任何地方都看不到它,是吗?