Отсутствие доступа к переменным среды в файле `database.yml`

У меня есть следующий раздел разработки моего файла development.yml:

development:
  adapter: postgresql
  host: localhost
  database: testtb
  username: app_user
  password: ENV['APP_USER_POSTGRES_PASSWORD']     <= Troublesome line

Когда я открываю консоль рельсов через bundle exec rails console и набираю ENV['APP_USER_POSTGRES_PASSWORD'], я возвращаю пароль БД, указанный в моем локальном профиле. Однако, когда я запускаю свой сервер rails, он не может подключиться к БД, не выполнив

PGError FATAL:  password authentication failed for user "app_user"

Ранее это работало, когда у меня был пароль БД, который фактически был напечатан в виде обычного текста, вместо того, чтобы пытаться получить к нему доступ через ENV['...'], но по очевидным причинам я хочу полностью сохранить фактический пароль из этого файла (и, следовательно, из репозитория кода), сохраняя возможность совершать другие незащищенные изменения в файле database.yml.

Есть ли что-то особенное в синтаксисе, который я пропускаю, или переменные среды по какой-либо причине недоступны, когда загружается файл database.yml?

Ответ 1

Обновление:. Некоторые люди сообщают в комментариях, что это не работает с Rails 4.2.x.x. Я не пробовал это сам, поэтому YMMV.


А, наконец, выяснил простое решение - он принимает встроенный Ruby:

password: <%= ENV['APP_USER_POSTGRES_PASSWORD'] %>

Ответ 2

Краткое и быстрое решение, если вы используете новую версию Rails! Выполните следующую команду:

spring stop

.. затем запустите rails console или другую команду rails. Моя проблема заключалась в том, что сервер Spring необходимо перезапустить, чтобы обновить/загрузить новые VAR файлы ENV. Я запускал консоль Rails и не видел их, пока не отключу Spring.

Предыдущие версии Rails не имели этой проблемы, так как они не использовали сервер Spring.

Еще один инструмент, который поможет вам устранить неполадки. Используйте следующую команду, чтобы распечатать конфигурацию database.yml. Вы можете запустить ее из командной строки, но я предпочитаю запускать ее в консоли Rails, так как вы можете использовать awesome_print, чтобы сделать ее довольно:

Внутри rails console:

puts ActiveRecord::Base.configurations

... или используя awesome_print

ap ActiveRecord::Base.configurations

Или вместо командной строки:

bin/rails runner 'puts ActiveRecord::Base.configurations'