2013-08-22 2 views
-1

Я хочу напечатать значение массива/хеш-ключа без повышения исключения, когда индекс не найден. (Обратите внимание, я не ищу спасения здесь)Как проверить, существует ли массив/хэш-ключ до его вызова?

<%= content.categories[0].name %> 

В приведенном выше заявлении, если категории является пустой массив, то будет сгенерировано исключение. Поскольку я использую этот код в своих представлениях, я хочу, чтобы код был очень кратким и все же ничего не печатал, если категории пусты.

+2

'Hash # []' и 'Array # []' не вызывать ошибки, когда ключ/индекс не найден. Это 'имя' вызывает ошибку. – sawa

+0

@sawa 'nil.name', безусловно, вызовет ошибку. – meagar

+0

@meagar Конечно. Чтобы дать хорошее предложение OP, OP должен сказать, когда (в каком классе) определено «имя». – sawa

ответ

8

Проблема не в том, что вы получаете доступ к пустующему массиву, это очень хорошо. Доступ к неопределенному индексу массива будет оцениваться до nil. Проблема в том, что вы пытаетесь вызвать метод на этом nil, который вызывает NoMethodError.

Использование try, он специально предназначен для решения проблемы, которую вы имеете, который является то, что вы лениво избежать проверки nil перед вызовом метода:

<%= content.categories[0].try(:name) %> 

Вы можете даже цепь try снова, хотя чрезмерное использование try следует избегать:

<%= content.categories[0].try(:name).try(:length) %> 

в качестве альтернативы можно использовать традиционные операторы управления потоком:

<%= content.categories[0].name if content.categories[0] %> 
+0

Я думаю, стоит отметить, что ['try'] (http://api.rubyonrails.org/classes/Object.html#method-i-try) изменен в Rails 4, и теперь есть [' try! '] (http://api.rubyonrails.org/classes/Object.html#method-i-try-21), если вы все еще хотите поведение Rails 3. –

+0

@muistooshort Стоит отметить, что, полагаю, хотя в этом случае это не имеет значения; как я понимаю, новое поведение только «try» вызывается на объекте, отличном от 'nil'. Мы * определенно * имеем дело с 'nil.try' здесь. – meagar

+0

благодарит @meagar за понимание моего требования и решение, хотя я ошибся в анализе проблемы. Ваше решение помогает моим требованиям. – shankardevy

0
content.categories.tap{|a| break a[0].name unless a.empty?} 
Смежные вопросы