Ошибка Rails: неопределенный метод ` ' для nil: NilClass

Итак, поскольку я новичок в рельсах (и в 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

Свойство количества для line_item имеет целочисленный тип. Должна быть возможность добавлять к нему целые числа, верно? Вот где я в замешательстве на данный момент.

Вот метод «создать» в 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 Я думал, что этот метод является частью методов поиска фреймворка rails. Кто-нибудь может это подтвердить?   -  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 равно null. Это может быть целое число, но храниться как null в базе данных. В этом случае вы можете установить одно значение по умолчанию (при миграции) или при первом создании вы можете установить значение количества равным 1.

person Walt    schedule 13.01.2013