2010-04-07 2 views
3

У меня есть модель книги в приложении Rails с различными свойствами (так называемые столбцы в таблице db книги). Одним из таких свойств является «ранжирование».Что вызывает «NoMethodError: undefined method» include? для nil: NilClass "

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

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

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

Любые идеи?

P.S. Эта проблема периодически возникала с другими моделями и атрибутами ... а не только с атрибутом Book и Rank.

+0

Это случалось со мной иногда в консоли после перезагрузка приложения. Я понял, откуда это происходит, но я забыл. Где-то глубоко в коде rails. Я думаю, возможно, это связано с интерфейсом mysql, вы используете mysql? – mckeed

+0

Я использую PostgreSQL, и мое приложение работает на Heroku. Когда я вхожу в консоль Heroku удаленно, эта ошибка появляется все время (но никогда не на моей локальной консоли). – NudeCanalTroll

+0

Я знаю, что сейчас это действительно старо, но я получил поддержку, поскольку я вижу ту же ошибку, связанную с методом, который проверяет «.nil?», А не «.blank?».Это не происходит последовательно, и второй запуск того же кода или обновления страницы всегда, кажется, возвращается к ожидаемому поведению. Это только началось, когда я переключил среду dev с SQLite3 на MySQL, чтобы более точно имитировать производственную среду, поэтому я склонен согласиться с @mckeed. – Leo

ответ

2

Объект книги - это тот, который равен нулю, а не ранжированию. Поэтому наличие

return book.ranking unless book.nil? 

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

+0

Если это так, не должна быть ошибка «NoMethodError: undefined method« ranking »для nil: NilClass'? – NudeCanalTroll

+0

Хорошо, я думаю, что я ошибаюсь. Я смотрю http://github.com/rails/rails/blob/2-3-stable/activerecord/lib/active_record/attribute_methods.rb, метод_missing (который вызывается при вызове вашего метода ранжирования), кажется, вызывает включают? на @ атрибутах. Может быть, это по какой-то причине ноль? –

+1

Я столкнулся с этой проблемой: это не имело ничего общего с тем, что объект был ник, как многие из этого потока сказали, но что-то не так внутри рельсов. «question.id» вызывал nil.include? но «question [: id]» работал нормально. Я думаю, что это что-то с @attributes, как предлагает Роб, но я не могу его закрепить. Вывод «question.attributes» в регистратор, казалось, возвращал абсолютно нормальные результаты. –

0

вы должны проверить, если книга ноль либо

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

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

book.try(:ranking) 

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

+0

пытается работать, но это не в Ruby 1.8 ... Вы должны использовать Active Support, чтобы получить его в 1.8 – severin

+0

@severin: Учитывая этот вопрос с Rails, я предположил, что у них уже была активная поддержка. –

0

Вы можете сделать это также таким образом:

return book.ranking unless book and book.ranking 

или andand самоцвета:

return book.ranking unless book.andand.ranking 
1

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

чек с если:

return book.ranking if book 

использование & &/и:

return book && book.ranking 

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

return book.try(:ranking) 

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

  • Нет связанных вопросов^_^