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