Грешка в Rails: недефиниран метод „“ за nil:NilClass

Тъй като съм сравнително нов в rails (и ruby), все още се опитвам да разбера къде всичко се обърка тук. Работя върху количка в уеб магазин. Потребителят получава сесия, където се съхраняват неговите артикули от количката (в този случай line_item.rb).

Проблем: Когато щракна върху артикул, той се добавя към количката чрез метода за количка add_product. Ако щракнете отново върху същия артикул, вместо да добавяте същия артикул два пъти, той трябва просто да ++1 към свойството количество на този артикул. Но когато го щракна втори път, получавам страницата за грешка, която казва:

NoMethodError в LineItemsController#create

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

Свойството quantity за line_item е от тип integer. Трябва да можете да добавяте цели числа към него, нали? Ето тук съм объркан в момента.

Ето метода "create" в line_items_controller.rb:

  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

край

Някакви идеи?

наздраве


person Majoren    schedule 13.01.2013    source източник
comment
Съобщението за грешка трябва да показва на кой ред се проваля. Тъй като съобщението за грешка е NoMethodError in LineItemsController#create, предполагам, че трябва да е с ред в метода create, а не в Cart#add_product, както споменавате.   -  person Prakash Murthy    schedule 13.01.2013
comment
Къде е дефиниран вашият метод find_by_product_id? current_item не получава стойност.   -  person ctilley79    schedule 13.01.2013
comment
@PrakashMurthy, ето го: app/models/cart.rb:7:in add_product' app/controllers/line_items_controller.rb:45:in create' Гледам го, но не мога да разбера какво не е наред. @ctilley79 Мислех, че този метод е част от методите за намиране на рамката на релсите. Може ли някой да потвърди това?   -  person Majoren    schedule 13.01.2013
comment
Да, мога да потвърдя, че това съществува, след като се забърках в един мой проект. Очевидно никога не съм имала нужда от него.   -  person ctilley79    schedule 13.01.2013
comment
поставете лог отчет и се опитайте да отпечатате продукта на ред 3 на вашия контролер. Имах проблем, при който синтаксисът за params[:product_id] беше неправилен. Ако случаят е такъв, опитайте нещо като params[][product_id]. Доста съм убеден, че това е.   -  person ctilley79    schedule 13.01.2013


Отговори (2)


Мисля, че е защото current_item няма никакво количество. Вероятно няма стойност по подразбиране. Очаквате да е 0, но всъщност е nil.

Задавам стойност по подразбиране и се уверявам, че тази колона не може да бъде нула. Освен това можете да дефинирате метод before_create, който ще зададе тази стойност на 0 преди запис (ако е нула).

Друг начин да поправите това е да се уверите, че нямате нула там:

current_item.quantity = current_item.quantity.blank? ? 1 : current_item.quantity + 1
person Amir    schedule 13.01.2013
comment
Уау... да, това го оправя. Въпреки че, разбира се, трябва да се уверя, че стойността по подразбиране е 1. Благодаря ви за отделеното време. - person Majoren; 13.01.2013

Това казва, че current_item.quantity е нула. Това може да бъде цяло число, но да се съхранява като нула в базата данни. Ако това е така, можете да зададете една стойност по подразбиране (при мигриране) или когато създавате за първи път, можете да зададете стойността на количеството на 1.

person Walt    schedule 13.01.2013