вторник, 10 февраля 2015 г.

NoMethodError: undefined method `[]' for nil:NilClass

Данная ошибка может возникать в Ruby при попытке обратиться к несуществующему свойству объекта, который почему-то стал nil.
Рассмотрим пример, запустив консоль Rials (rails c):
hash = {a: 1, b: {c: 2}}
=> {:a=>1, :b=>{:c=>2}}

# Получаем элемент с индексом :a
hash[:a]
=> 1

# Получаем элемент с индексом :b
hash[:b]
=> {:c=>2}

# Получаем элемент с индексом :b, а для него - с индексом :c
hash[:b][:c]
=> 2

# Пытаемся получить эл-нт с индексом :zzz, а для него - с индексом :c
hash[:zzz][:c]
NoMethodError: undefined method `[]' for nil:NilClass

Как видно, при попытке получить элемент с индексом :zzz мы получаем nil, и уже для nil мы пытаемся найти элемент с индексом :c, что приводит к ошибке, ведь у nil нет метода [].

Решение:

hash[:zzz].try(:[], :c)

Обратите внимание, что этот способ работает только в Rails. В чистом Ruby он не поможет, там можно использовать трюк с if:
hash[:zzz][:c] if hash[:zzz]