2010-09-17 2 views
3

Я нахожу, что мне часто приходится использовать структуру, чтобы избежать ошибки Rails undefined method 'name' for nil:NilClass.Как высушить структуру условного обозначения рубина, необходимую для Rails

структура выглядит следующим образом:

if country.state 
    country.state.name 
end 

Похоже, классический случай повторения себя с country.state появляться дважды в одном простом блоке. Есть ли способ сушить это?

+1

Как СУХОЙ это правильно будет зависеть от того, что вы пытаетесь сделать с 'country.state.name'. Вы просто пытаетесь вернуть его и возвратите 'nil', если' country.state' 'nil'? –

+0

Да. Иногда не было исходных данных для кода страны штата, поэтому я не хочу, чтобы он выдавал исключение. –

ответ

4

Rails добавляет try method к объекту, который имитирует объект # send, но не вызывает исключение, если объект возвращает nil.

Я думаю, что синтаксис

country.try(:state).name 
+0

Этот метод работает, но я должен его произнести следующим образом: 'State.try (: find_by_iso,« AF »). Try (: country) .try (: name)' –

+0

Не должно быть 'country.state. попробуйте (: name) 'вместо этого? –

2

Ну не совсем. Один из вариантов - установить andand gem, но введение зависимости для этого может быть немного.

1

Другие, чем при использовании немного более лаконичный синтаксис:

country.state.name unless country.state.nil? 

Я не думаю, что есть DRY способ сделать это с приведенной информацией. Я бы сказал, что если вы не можете быть уверены в том, что country.state ничто или нет, вы можете посмотреть код, ответственный за установку этого значения, и определить, является ли это нормальным случаем, или следует ли это проверять вверху вверх.

+0

Некоторые из 'country.state' равны нулю, поскольку в исходных данных не было информации для этих состояний. –

+0

Может также быть country.state.name, если country.state – Yannis

+0

Хороший звонок Яннис. Рид, да, ты ничего не можешь поделать с этим, я полагаю. , , ваша проверка может быть настолько строгой, насколько позволяют ваши данные. – brokenbeatnik

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