Nil的NoMethodError:NilClass,rails

时间:2016-05-22 14:23:06

标签: ruby ruby-on-rails-4 activerecord

此代码中是否有任何错误?

if current_user.cart
        existing_product = current_user.cart.products.find_by(id:@product.id)
    if existing_product
        subq = SubQuantity.where(product_id: @product.id, cart_id: current_user.cart.id)
        sub_quant = params[:quant]
        subq.first.sub_quantity = subq.first.sub_quantity + sub_quant.to_i
    else
        current_user.cart.products << @product
        subq = SubQuantity.create
        sub_quant = params[:quant]
        subq.sub_quantity = sub_quant
        subq.product = @product
        subq.cart = current_user.cart
    end
else
    @cart = Cart.create
    @sub_quantity = SubQuantity.create
    sub_quant = params[:quant]
    @sub_quantity.sub_quantity = sub_quant
    @product.sub_quantities <<  @sub_quantity
    @cart.sub_quantities <<  @sub_quantity
    @cart.products << @product
    @cart.user = current_user
    @cart.save
    @sub_quantity.save
end
redirect_to root_path

我要做的是,检查current_user的购物车是否有任何带有id = @ product.id的产品,然后增加其数量,否则在购物车中添加产品。我的代码无效..我收到此错误了undefined method sub_quantity for nil:NilClass
在这一行,
subq.first.sub_quantity = subq.first.sub_quantity + sub_quant.to_i

2 个答案:

答案 0 :(得分:1)

如果这个

 subq.first.sub_quantity = subq.first.sub_quantity + sub_quant.to_i

产生

 undefined method sub_quantity for nil:NilClass 

这只是意味着subq.first返回零。 nil没有sub_quantity方法,您尝试对其进行调用,因此您会收到该错误。

subq定义为:

  subq = SubQuantity.where(product_id: @product.id, cart_id: current_user.cart.id)

因此,这意味着没有与您的查询匹配的SubQuantity对象(即数据库中的行)。如果您的ActiveRecord查询未返回任何结果,则在其上调用first将返回nil。因此,不存在product_id @product.idcart_id current_user.cart.id的子数量。

为什么会这样,是否应该,或者你的代码应该如何响应这种情况 - 取决于你的应用程序中发生了什么,我不能说。

答案 1 :(得分:0)

试试这个:

if existing_product
    //find sub_quantity associated with that product.
    subq = SubQuantity.where(product_id: @product.id, cart_id: current_user.cart.id).first
    if subq
      subq.sub_quantity = subq.first.sub_quantity + params[:quant].to_i 
      subq.save
    end
else
    current_user.cart.products << @product
    // Create a SubQuantity with all attributtes
    SubQuantity.create(sub_quantity: params[:quant], product: @product, cart: current_user.cart)
end