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


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

users_controller.РБ

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
2 54

2 ответа:

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

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

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

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

def show
  @city = @user.city?
end

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

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

if (variable)
  # ...
end

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

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

можно использовать .подарок?, который поставляется в комплекте с 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? вместо.