web-dev-qa-db-fra.com

Impossible d'accéder aux variables d'environnement dans le fichier `database.yml`

J'ai la section de développement suivante de mon development.yml fichier:

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

Lorsque j'ouvre une console Rails via bundle exec Rails console et tapez ENV['APP_USER_POSTGRES_PASSWORD'] Je récupère le mot de passe DB que j'ai spécifié dans mon profil local. Cependant, lorsque je démarre mon Rails serveur, il ne peut pas se connecter à la base de données, à défaut avec

PGError FATAL:  password authentication failed for user "app_user"

Cela fonctionnait auparavant lorsque le mot de passe de la base de données avait été tapé en texte brut, plutôt que d'essayer d'y accéder via ENV['...'], mais pour des raisons évidentes, je souhaite conserver le mot de passe réel hors de ce fichier entièrement (et donc hors du référentiel de code) tout en étant en mesure de valider d'autres modifications non sécurisées du database.yml fichier.

Y a-t-il quelque chose de spécial dans la syntaxe qui me manque, ou les variables d'environnement pour une raison quelconque ne sont-elles pas disponibles lorsque le database.yml le fichier est en cours de chargement?

64
jefflunt

Mise à jour: Certaines personnes signalent dans les commentaires que cela ne fonctionne pas à partir de Rails 4.2.x.x. Je ne l'ai pas essayé moi-même, donc YMMV.


Ah, enfin trouvé la solution simple - il accepte Ruby intégré:

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

Solution courte et rapide si vous utilisez une version plus récente Rails! Exécutez la commande suivante:

spring stop

..then run Rails console ou autre Rails. Mon problème était que le serveur Spring devait être redémarré pour actualiser/récupérer mes nouvelles versions ENV. Je démarrais Rails = console et il ne pouvait pas les voir jusqu'à ce que j'arrête Spring.

Les versions précédentes de Rails n'avaient pas ce problème car elles n'utilisaient pas le serveur Spring.

Un autre outil pour vous aider à résoudre les problèmes - Utilisez la commande suivante pour imprimer votre configuration database.yml. Vous pouvez l'exécuter à partir de la ligne de commande, mais je préfère l'exécuter dans la console Rails depuis, vous pouvez utiliser awesome_print pour le rendre joli:

Dans Rails console:

puts ActiveRecord::Base.configurations

... ou en utilisant awesome_print

ap ActiveRecord::Base.configurations

Ou à la place depuis la ligne de commande:

bin/Rails runner 'puts ActiveRecord::Base.configurations'
21
FireDragon