Есть ли встроенная поддержка в рельсах для идиомы подстановки значений по умолчанию? - PullRequest
13 голосов
/ 03 сентября 2010

Я часто пишу код для предоставления значения по умолчанию при обнаружении значения nil / empty.

Например:

category = order.category || "Any"
#  OR
category = order.category.empty? ? "Any" : order.category

Я собираюсь расширить метод try для обработки этой идиомы.

category = order.try(:category, :on_nill => "Any")
#  OR
category = order.try(:category, :on_empty=> "Any")

Мне интересно, есть ли в Rails / Ruby какой-либо метод для обработки этой идиомы?

Примечание:

Я пытаюсь исключить повторение || / or / ? идиом, основанных на операторе.

По сути я ищу эквивалент try метода для обработки сценариев замены по умолчанию.

Без try метода:

product_id = user.orders.first.product_id unless user.orders.first.nil? 

С try методом:

product_id = user.orders.first.try(:product_id)

Легко реализовать общий подход для обработки этой идиомы, но я хочу убедиться, что я не изобретаю колесо заново.

Ответы [ 3 ]

16 голосов
/ 02 февраля 2011

См. этот вопрос .ActiveSupport добавляет метод presence ко всем объектам, который возвращает его получатель, если present? (противоположно blank?), и nil в противном случае.

Пример:

host = config[:host].presence || 'localhost'
1 голос
/ 03 сентября 2010

Возможно, это может послужить:

class Object
  def subst_if(condition, replacement)
    condition = send(condition) if condition.respond_to?(:to_sym)
    if condition
      replacement
    else  
      self
    end
  end
end

Используется примерно так:

p ''.subst_if(:empty?, 'empty')       # => "empty"
p 'foo'.subst_if(:empty?, 'empty')    # => "foo"

Также принимает отдельные условия, не связанные с объектом:

p 'foo'.subst_if(false, 'bar')    # => 'foo'
p 'bar'.subst_if(true,  'bar')    # => 'bar'

Я не в восторге от названия subst_if.Я бы позаимствовал любое имя, которое использует Лисп для этой функции, если бы я знал это (предполагая, что оно существует).

0 голосов
/ 03 сентября 2010

Уверен, что это не выпекается. Вот ссылка на похожий вопрос / ответ .Это подход, который я использую.Использование ruby: ||= синтаксис

В стороне: Этот вопрос также напоминает мне о первых Railscasts всех времен: Кэширование с переменными экземпляра , что полезноскринкаст, если вам нужно выполнить такую ​​операцию в контроллере

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...