У меня есть куча переменных окружения с моей конфигурации в них:Есть ли лучший способ добавить, если не ноль в Ruby?
DB_HOSTNAME=something.rds.amazonaws.com
DB_PORTNUM=9999
DB_USERNAME=production
DB_PASSWORD=xyzzy
Чтобы сделать DB строку подключения из них это что-то вроде:
"postgres://" +
"#{ENV['DB_USERNAME']}#{ENV['DB_PASSWORD'] ? ":#{ENV['DB_PASSWORD']}" : nil}" +
"@#{ENV['DB_HOSTNAME']}#{ENV['DB_PORTNUM'] ? ":#{ENV['DB_PORTNUM']}" : nil}" +
"/proper_scraper_#{$environment}"
Таким образом, он работает в разработке/тест, где DB_PASSWORD
и DB_PORTNUM
не установлены и работают в производстве, где они есть. Но это немного некрасиво:
ENV['DB_PASSWORD'] ? ":#{ENV['DB_PASSWORD']}" : nil
Нужные семантика: перед именем, если не ноль и возвращать ноль в противном случае. В идеале было бы что-то вроде этого:
ENV['DB_PASSWORD'].try(:prepend, ':')
Использование Object.try что-то вроде этого:
def try method, *args
send(method, *args) if respond_to? method
end
Но это не работает, потому что перед именем мутирует строку (почему?) И Env строки заморожены , Альтернативный вариант:
ENV['DB_PASSWORD'].dup.try(:prepend, ':')
Но это не сработает, если переменная окружения не установлена, поскольку вы не можете использовать нуль.
Есть ли здесь хороший однострочный лайнер или я застрял в беспорядке?
Это правда и может быть лучшим решением. Но он чувствует себя излишним, чтобы вытащить совершенно новый 'require' только для некоторой простой конкатенации строк. –
Если я не ошибаюсь, «Object # try» исходит из Rails, это, возможно, более тяжелое, требующее решения решение. –
На самом деле я обезьяна-исправил его в себе, используя реализацию, которую я показал в вопросе. Но вы правы, и я думаю, что ваше решение, вероятно, является самым ярким проявлением, которое я видел до сих пор. –