2016-05-12 2 views
0

Каков наилучший способ гарантировать, что модель существует до выполнения интерполяции строк? У меня есть переменная user, и мне нужно посмотреть, что такое майор user. Информация о пользователе находится в таблице между именем user_attributes.Надежная интерполяция строк в Rails

#{user.user_attribute.major.name} 

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

+1

[Деметр: Это не просто хорошая идея. Это закон.] (Http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/) – Stefan

ответ

4

Вы могли бы избежать try и добавить метод к вашей модели или декоратора ..

def major_name 
    user_attribute.major && user_attribute.major.name 
end 

ИЛИ

def major_name 
    user_attribute.major.name if user_attribute.major? 
end 

Проверил: https://codereview.stackexchange.com/questions/28610/handling-nil-trying-to-avoid-try

+1

Спасибо! Это тот ответ, с которым я пошел. Мне нравится идея делать логику в модели вместо представления, так что спасибо! – ajk4550

3

Вы можете использовать try метод:

# if model is present 
{user.user_attribute.major.try(:name)} # => "<MAJOR_NAME>" 

# if model is NOT present 
{user.user_attribute.major.try(:name)} # => "" 

Вы можете прочитать больше о try.

2

Вы можете использовать lonely operator. Это как try, но немного менее функциональный (что не имеет значения в вашем случае).

user.user_attribute.major&.name 
+1

Только для Ruby 2.3 – Leito

+0

@ Leito: да, забыл упомянуть, спасибо :) И вы имеете в виду «2.3+» –

+0

Хахаха, вы только в будущем проверяете свой ответ. 2.3 является последним, и мы не знаем, придерживается ли это в будущих версиях, но я не вижу его никуда. – Leito

-1

Это вполне может быть «худшим» ответ на рубиновые пуританин, но это работает для меня в некоторых сценариях:

"#{user.user_attribute.major.name rescue nil}" 
+0

Речь идет не о рубине-пуританке или нет, это просто нехорошее решение. – Leito

+0

@ Leito - почему это не хорошее решение? Если все, что мне нужно, это строка, если она присутствует, или пустая строка, если основной нет, то это разумное решение. В моем сценарии я строю сложную строку, интерполируя различные методы модели, некоторые из которых могут отсутствовать. Я использую это, и он работает. – Anand

+0

Является злоупотреблением исключениями (исключительная природа). Вы не должны ожидать этого или использовать его как условное. Существует также производительность, см. Http://stackoverflow.com/a/15397057/637094 для более подробной информации. Я не утверждаю, что это работает, я знаю, что это так, и это решение, но просто не очень хорошее. – Leito

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