无法访问`database.yml`文件中的环境变量

时间:2011-12-31 04:08:00

标签: ruby-on-rails environment-variables yaml ruby-on-rails-2

我的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文件时由于某种原因环境变量不可用?

2 个答案:

答案 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'