2

所以,由于我对 Rails(和 ruby​​)还很陌生,所以我仍然试图了解这里哪里出了问题。我正在网上商店的购物车上工作。用户获得一个存储他的购物车项目(在本例中为 line_item.rb)的会话。

问题: 当我单击一个项目时,它会通过购物车方法 add_product 添加到购物车中。如果您再次单击同一个项目,而不是两次添加相同的项目,它应该简单地 ++1 到该项目的数量属性。但是,当我第二次单击它时,我得到错误页面:

LineItemsController#create 中的 NoMethodError

undefined method `+' for nil:NilClass

这是我的购物车.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
      Rails.logger.debug(current_item.quantity)
    else
      current_item = line_items.build(:product_id => product_id)
    end
    current_item
  end
end

line_item 的数量属性是整数类型。应该能够向它添加整数,对吧?这就是我此刻感到困惑的地方。

这是 line_items_controller.rb 中的“create”方法:

  def create
@cart = current_cart
product = Product.find(params[:product_id])
@line_item = @cart.add_product(product.id)
@line_item.product = product

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

结尾

有任何想法吗?

干杯

4

2 回答 2

4

我认为这是因为 current_item 没有任何数量。可能没有默认值。您期望它为 0,但实际上是nil.

我设置了一个默认值,并确保该列不能为零。此外,您可以定义一个before_create在保存之前将该值设置为 0 的方法(如果它为 nil)。

解决此问题的另一种方法是确保那里没有 nil :

current_item.quantity = current_item.quantity.blank? ? 1 : current_item.quantity + 1
于 2013-01-13T16:20:17.170 回答
0

这表示 current_item.quantity 为空。这可以是整数,但在数据库中存储为空。如果是这样,您可以默认设置一个值(在迁移中),或者当您第一次创建时,您可以将数量值设置为 1。

于 2013-01-13T16:21:51.340 回答