Проверьте, не ноль и не пуст в 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
Ответы
Ответ 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?
.