Подтвердить что ты не робот

Проверьте, не ноль и не пуст в Rails ярлык?

У меня есть страница показа для моих пользователей, и каждый атрибут должен быть только видимым на этой странице, если это не ноль, а не пустая строка. Ниже у меня есть мой контроллер, и довольно неприятно писать одну и ту же строку кода @user.city != nil && @user.city != "" для каждой переменной. Я не слишком хорошо разбираюсь в создании собственных методов, но могу ли я как-нибудь создать ярлык, чтобы сделать что-то вроде этого: @city = check_attr(@user.city)? Или есть лучший способ сократить эту процедуру?

users_controller.rb

def show 
  @city = @user.city != nil && @user.city != ""
  @state = @user.state != nil && @user.state != ""
  @bio = @user.bio != nil && @user.bio != ""
  @contact = @user.contact != nil && @user.contact != ""
  @twitter = @user.twitter != nil && @user.twitter != ""
  @mail = @user.mail != nil && @user.mail != ""
end
4b9b3361

Ответ 1

Есть способ, который делает это для вас:

def show
  @city = @user.city.present?
end

Тест метода present? для not- nil plus имеет контент. Пустые строки, строки, состоящие из пробелов или вкладок, считаются отсутствующими.

Поскольку этот шаблон настолько распространен, там даже ярлык в ActiveRecord:

def show
  @city = @user.city?
end

Это примерно эквивалентно.

В качестве примечания тестирование vs nil почти всегда избыточно. В Ruby есть только два логически ложных значения: nil и false. Если это невозможно, чтобы переменная была буквальной false, этого было бы достаточно:

if (variable)
  # ...
end

Это предпочтительнее обычного материала if (!variable.nil?) или if (variable != nil), который появляется иногда. Ruby склоняется к более редукционистскому типу выражения.

Одна из причин, по которой вы хотите сравнить vs. nil, - это если у вас есть переменная tri-state, которая может быть true, false или nil, и вам нужно провести различие между двумя последними состояниями.

Ответ 2

Вы можете использовать . present?, который входит в состав ActiveSupport.

@city = @user.city.present?
# etc ...

Вы даже можете написать это как

def show
  %w(city state bio contact twitter mail).each do |attr|
    instance_variable_set "@#{attr}", @user[attr].present?
  end
end

Стоит отметить, что если вы хотите проверить, что что-то пустое, вы можете использовать .blank? (это противоположно .present?)

Кроме того, не используйте foo == nil. Вместо этого используйте foo.nil?.