Как высушить условную структуру ruby, необходимую для Rails

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

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

 if country.state
   country.state.name
 end

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


person Reed G. Law    schedule 17.09.2010    source источник
comment
Как правильно высушить это, будет зависеть от того, что вы пытаетесь сделать с country.state.name. Вы просто пытаетесь вернуть его и вернуть nil, если country.state равно nil?   -  person Brian Campbell    schedule 18.09.2010
comment
да. Иногда не было исходных данных для кода страны штата, поэтому я не хочу, чтобы это вызывало исключение.   -  person Reed G. Law    schedule 18.09.2010


Ответы (3)


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

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

country.try(:state).name
person Steve Weet    schedule 17.09.2010
comment
Этот метод работает, но я должен сформулировать его так: State.try(:find_by_iso, "AF").try(:country).try(:name) - person Reed G. Law; 18.09.2010
comment
Разве это не должно быть country.state.try(:name) вместо этого? - person Mladen Jablanović; 18.09.2010

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

person yxhuvud    schedule 17.09.2010

Кроме использования немного более лаконичного синтаксиса:

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

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

person brokenbeatnik    schedule 17.09.2010
comment
Некоторые из country.state равны нулю, потому что в исходных данных не было информации об этих состояниях. - person Reed G. Law; 18.09.2010
comment
Также может быть country.state.name, если country.state - person Yannis; 18.09.2010
comment
Хороший звонок, Яннис. Рид, да, тогда, я полагаю, ты ничего не сможешь с этим поделать. . . ваша проверка может быть настолько строгой, насколько позволяют ваши данные. - person brokenbeatnik; 19.09.2010