Ruby/Rails с использованием || для определения значения, используя пустую строку вместо значения nil

Я обычно делаю

 value = input || "default"

поэтому, если input = nil

 value = "default"

Но как я могу это сделать, а вместо nil Он также считает пустую строку '' как nil

Я хочу, чтобы, если я делаю

input = ''
value = input || "default"
=> "default"

Есть ли простой элегантный способ сделать это без if?

Ответ 1

Rails добавляет метод presence ко всему объекту, который делает именно то, что вы хотите

input = ''
value = input.presence || "default"
=> "default"

input = 'value'
value = input.presence || "default"
=> "value"

input = nil
value = input.presence || "default"
=> "default"

Ответ 2

Я обычно делаю так:

value = input.blank? ? "default" : input

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

value = input || (input.blank? ? "default" : input)
# I just tried that the parentheses are required, or else its return is incorrect

Для чистого рубина (не зависит от Rails) вы можете использовать empty?

value = input || (input.empty? ? "default" : input)
value = (input ||= "").empty? ? "default" : input # thanks gg_s for providing this

Ответ 3

Возможно, неважно, но я бы использовал highline следующим образом:

require "highline/import"

input = ask('Input: ') { |q| q.default = "default" }

Он работает без Rails. Действительно аккуратное решение.