2014-11-05 2 views

ответ

2

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

def showVerifiedIcon(user) 
    u = User.find_by_username(user) 
    if u.try(:verified?) #will return nil if u is nil 
    '<i class="fa fa-check-circle verified-icon fa-lg"></i>' 
    else 
    end 
end 
+1

'User.find_by (...)' более кратким, чем 'User.where (...). first'. – tadman

+0

ОК отредактируйте это в моем ответе, и я соглашусь –

+0

Мне лично не нравится 'try', и он выглядит как запах кода каждый раз, когда я нахожу его в базе кода. Причина в том, что, когда вы используете try, у вас нет уверенности, если у вас есть объект на нет. Он нарушает «Скажи, не спрашивай принцип». – Barbared

2

Проблема заключается в том, что вы не знаете ли User.where(username: user).first возвращает объект вы ожидаете или нет. Если не этот запрос вернет nil, значит, в следующей строке вы вызываете метод verified на nil, вызывая ошибку, которую вы видите.

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

Всегда проверяйте перед выполнением вызова любого метода:

def showVerifiedIcon(name) 
    '<i class="fa fa-check-circle verified-icon fa-lg"></i>' if user(name) 
end 

private 

def user(name) 
    User.find_by_username(name) 
end 

If User.find_by_username возвращает nil, то ваш, если заявление не будет оказывать вам HTML элемент

+0

Теперь я получаю 'неправильное количество аргументов (0 для 1)' – Un3qual

+0

@ Un3qual да, потому что я забыл передать пользователя раньше :) Я отредактировал ответ – Barbared

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