2015-06-20 3 views
0

Я создаю приложение простого менеджера активов в Rails 4.2.2 и Ruby 2.2.2. В моей asset модели я использую функцию обратного вызова с before_create для вызова функции generate_asset_number как такundefined метод `split 'for nil: NilClass Rails

def generate_asset_number 
     company = "AMS" 
     if Asset.count == 0 
     self.asset_number = "#{company}-00001" 
     else 
     last = Asset.last.asset_number 
     end 
     number = last.split('-')[1].to_i 
     number += 1 
     self.asset_number = company + '-' + "%05d" % number 
     end 
    end 

Как вы можете видеть, я устанавливаю переменной компании в виде строки, оценки, если Asset.count равен 0, то возвращая строку «AMS-00001», если Asset.count не равен 0, я назначаю last Asset.last.asset_number, чтобы вывести последний номер в последовательности.

Где я получаю сработал с установкой переменной числа, чтобы вернуть последний номер инцидента и разделить на него вызов, чтобы извлечь вторую часть массива и преобразовать в целое число, чтобы я мог увеличить его.

Когда я запускаю это из консоли или попытаться создать новую запись в представлении, я получаю следующее сообщение об ошибке:

undefined method раскола»для ноля: NilClass`

Я уверен, что мой синтаксис выключен, так как я больше из Ruby Jr.

Если кто-нибудь может помочь объяснить, что мне нужно сделать для рефакторинга и сделать эту работу, я был бы признателен. Если вам нужна дополнительная информация или если мой вопрос не ясен, сообщите мне.

ответ

3

undefined method split' for nil:NilClass`

Ошибка в том, что жизнь last переменные закончилась в цикле if-else и вы пытаетесь получить доступ lastвне петли if-else в этой строке number = last.split('-')[1].to_i. Вам нужно настроить свой код следующим образом:

def generate_asset_number 
    company = "AMS" 
    if Asset.count == 0 
    self.asset_number = "#{company}-00001" 
    else 
    last = Asset.last.asset_number 
    number = last.split('-')[1].to_i 
    number += 1 
    self.asset_number = company + '-' + "%05d" % number 
    end 
end 
+1

Это отлично работает, извините, это очень рано для меня, и я делал ошибки newb. В то же время я реорганизовал что-то похожее на ваш ответ, но использовал опцию if. Так что это намного чище! Большое спасибо <3 – nulltek

Смежные вопросы