Часто мне нужно проверить, не является ли какое-то значение пустым, и написать вот так: «Нет данных»:
@user.address.blank? ? "We don't know user's address" : @user.address
А когда у нас есть порядка 20-30 полей, которые нужно обрабатывать таким образом, это становится некрасивым.
Я сделал расширенный класс String с or
методом
class String
def or(what)
self.strip.blank? ? what : self
end
end
@user.address.or("We don't know user's address")
Теперь это выглядит лучше. Но он все еще грубый и грубый
Как лучше было бы решить мою проблему. Может быть, было бы лучше расширить ActiveSupport class
или использовать вспомогательный метод, миксины или что-то еще. Что мне могут рассказать рубиновая идеология, ваш опыт и лучшие практики.
ruby-on-rails
ruby
fl00r
источник
источник
Phrogz как бы дал мне идею в комментарии PofMagicfingers, но как насчет переопределения | вместо?
class String def |(what) self.strip.blank? ? what : self end end @user.address | "We don't know user's address"
источник
Поскольку вы делаете это в Ruby on Rails, похоже, что вы работаете с моделью. Если вы хотите , разумное значение по умолчанию везде в вашем приложении, вы можете (например) переопределить
address
метод дляUser
модели.Я недостаточно хорошо знаю ActiveRecord, чтобы предоставить для этого хороший код; в сиквеле это будет примерно так:
class User < Sequel::Model def address if (val=self[:address]).empty? "We don't know user's address" else val end end end
... но для приведенного выше примера кажется, что вы смешиваете логику представления в своей модели, что не является хорошей идеей.
источник
Ваш или метод может иметь некоторые нежелательные побочные эффекты, поскольку альтернативное значение (по умолчанию) всегда оценивается, даже если строка не пуста.
Например
@user.address.or User.make_a_long_and_painful_SQL_query_here
потребует дополнительной работы, даже если адрес не пустой. Возможно, вы могли бы немного обновить это (извините, что запутали однострочник, пытаясь сделать его коротким):
class String def or what = "" self.strip.empty? ? block_given? ? yield : what : self end end @user.address.or "We don't know user's address" @user.address.or { User.make_a_long_and_painful_SQL_query_here }
источник
a=2 ; a == 2 ? "ok" : @b = 3 ; @b; #=> nil
Возможно, лучше расширить ActiveRecord или отдельные модели вместо String.
На ваш взгляд, вы могли бы предпочесть более явный шаблон, например
@user.attr_or_default :address, "We don't know the user's address"
источник
Рубин:
unless my_str.empty? then my_str else 'default' end
RoR:
unless my_str.blank? then my_str else 'default' end
источник