RoR ActiveRecord / ActiveRelation错误:未定义的方法+用于nilClass

时间:2012-07-30 16:32:15

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

老实说,我比以往任何时候编程都更失落。最近,我一直试图摆脱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没有关系。

3 个答案:

答案 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。