Невозможность доступа к переменным окружения в файле `database.yml` - PullRequest
64 голосов
/ 31 декабря 2011

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

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

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

PGError FATAL:  password authentication failed for user "app_user"

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

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

Ответы [ 2 ]

164 голосов
/ 31 декабря 2011

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


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

password: <%= ENV['APP_USER_POSTGRES_PASSWORD'] %>
21 голосов
/ 30 мая 2016

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

spring stop

.. затем запустите rails console или другую команду rails. Моя проблема заключалась в том, что сервер Spring нужно было перезапустить, чтобы обновить / забрать мои новые варианты 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'
...