вторник, 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]
 

1 комментарий:

  1. MGM Grand Casino and Resort in Las Vegas will close on Jan. 20
    MGM Grand Casino and Resort in Las Vegas will close on Jan. 20. MGM 광양 출장안마 Resorts 경상남도 출장마사지 International 오산 출장마사지 announced 강원도 출장안마 Wednesday it has 포천 출장마사지 shuttered all of its restaurants

    ОтветитьУдалить