Что вызывает "NoMethodError: неопределенный метод" include? " для ноля: NilClass " - PullRequest
3 голосов
/ 07 апреля 2010

У меня есть модель Book в моем приложении Rails с различными свойствами (так называемые столбцы в таблице db book).Одним из этих свойств является «рейтинг».

В последнее время приложение может начать выдавать NoMethodError: undefined method 'include?' for nil:NilClass для следующего кода:

def some_method(book, another_arg)
  return book.ranking unless book.ranking.blank?
  ...
end

Однако это не соответствует.Подавляющее большинство времени доступа к book.ranking работает - ошибка выдается, возможно, в 2-4% случаев.Если я изменю код на book[:ranking] или book['ranking'] вместо book.ranking, он будет работать 100% времени.

Любые идеи?

PS Эта проблема периодически возникает сдругие модели и атрибуты ... не только книга и атрибут ранжирования.

Ответы [ 5 ]

2 голосов
/ 07 апреля 2010

объект книги - это тот, который равен нулю, а не ранжируется. Итак, имея

return book.ranking unless book.nil?

должен решить проблему.

1 голос
/ 08 апреля 2010

Есть несколько способов защиты от ноль-вызовов:

отметьте , если :

return book.ranking if book

используйте && / и :

return book && book.ranking

используйте попробуйте (в Ruby 1.9 или с Rails / ActiveSupport):

return book.try(:ranking)
1 голос
/ 08 апреля 2010

Я бы использовал try здесь:

book.try(:ranking)

Если book или ranking равно nil, будет возвращено nil.

0 голосов
/ 08 апреля 2010

Вы можете сделать это также так:

return book.ranking unless book and book.ranking

или andand драгоценный камень:

return book.ranking unless book.andand.ranking
0 голосов
/ 07 апреля 2010

Вы должны проверить, равна ли книга нулю

return book.ranking unless book.blank? and book.ranking.blank?
...