老实说,我比以往任何时候编程都更失落。最近,我一直试图摆脱5年多的PHP开发并尝试使用Ruby / Rails。我用Rails选择了敏捷Web开发,我一直在关注它。我携带的版本不同,包括Mac OS X Snow Leopard(最初迁移到Mountain Lion)和Ruby / Rails 1.8.7 / 3.2.6。
向购物车添加数量时,我的代码如下所示: cart.rb(型号)
class Cart < ActiveRecord::Base
has_many :line_items, :dependent => :destroy
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
end
我有attr_accessible:line_item.rb模型中的数量和line_items_controller.rb中的数量我正在调用@line_item = current_cart.add_product(product.id)。第一次将产品添加到购物车时,代码功能完美,但Rails第二次给我错误:
undefined method `+' for nil:NilClass
并指出问题中的明显界限(上面加上加号)。有什么建议?感谢。
编辑:如果有人也可以在评论中推荐这是学习Rails的最佳途径,或者我应该拿起另一本书或使用其他网站/等等,因为这不是代码第一次有这本书错了。
编辑2:摘录的line_items_controller.rb(第40-56行)
def create
@cart = current_cart
product = Product.find(params[:product_id])
@line_items = @cart.add_product(product.id) #product.id, product didn't work.
respond_to do |format|
if @line_item.save
format.html { redirect_to @line_item.cart, :notice => 'Line item was successfully created.' }
format.json { render :json => @line_item, :status => :created, :location => @line_item }
else
format.html { render :action => "new" }
format.json { render :json => @line_item.errors, :status => :unprocessable_entity }
end
end
end
此外,由于代码适用于一个项目而不是相同项目的顺序添加,我认为它与.save没有关系。
答案 0 :(得分:2)
您确定数量不是零。
尝试
if current_item && current_item.quantity.present?
而不是
if current_item
答案 1 :(得分:2)
永远不要将attr_accessor
(不要与attr_accessible
混淆)与数据库列支持的属性:您正在替换活动记录生成的访问者(这将返回列值) ,可能有一个使用实例变量的默认值为1)。该实例变量未设置,因此返回nil
早期版本的Agile Web Development with Rails很好(我曾经有过第一版)但我会确保你有最新版本 - 我认为它们现在已经达到了第4版或第5版。
答案 2 :(得分:0)
错误的含义是您的current_item
对象为nil
。您的find_by_product_id
查询未找到任何带有您作为参数传递的ID的对象
尝试检查控制器传递给模型的ID。