Есть ли встроенная поддержка в рельсах для именования замещения по умолчанию?

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

например:

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)

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

Ответ 1

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

Пример:

host = config[:host].presence || 'localhost'

Ответ 2

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

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. Я бы использовал любое имя Lisp для этой функции, если бы знал это (если оно существует).

Ответ 3

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

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