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?
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'] %>
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'