我的development.yml
文件的开发部分如下:
development:
adapter: postgresql
host: localhost
database: testtb
username: app_user
password: ENV['APP_USER_POSTGRES_PASSWORD'] <= Troublesome line
当我通过bundle exec rails console
打开rails控制台并输入ENV['APP_USER_POSTGRES_PASSWORD']
时,我会收到我在本地个人资料中指定的数据库密码。但是,当我启动我的rails服务器时,它无法连接到数据库,无法使用
PGError FATAL: password authentication failed for user "app_user"
这是以前工作的时候,我的数据库密码实际上是用纯文本输入的,而不是试图通过ENV['...']
访问它,但出于显而易见的原因,我想完全保留这个文件的实际密码(因此,在能够提交database.yml
文件的其他非安全更改的同时,不在代码存储库中。
我缺少的语法有什么特别之处,或者在加载database.yml
文件时由于某种原因环境变量不可用?
答案 0 :(得分:164)
更新:有些人在评论中报告说这不适用于Rails 4.2.x.x.我自己没试过,所以YMMV。
啊,终于找到了简单的解决方案 - 它接受嵌入式Ruby:
password: <%= ENV['APP_USER_POSTGRES_PASSWORD'] %>
答案 1 :(得分:21)
如果您运行较新的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'