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

jef*_*unt 64 yaml ruby-on-rails environment-variables ruby-on-rails-2

我有以下development.yml文件的开发部分:

development:
  adapter: postgresql
  host: localhost
  database: testtb
  username: app_user
  password: ENV['APP_USER_POSTGRES_PASSWORD']     <= Troublesome line
Run Code Online (Sandbox Code Playgroud)

当我打开一个rails控制台bundle exec rails console并键入时,ENV['APP_USER_POSTGRES_PASSWORD']我会回到我在本地配置文件中指定的数据库密码.但是,当我启动我的rails服务器时,它无法连接到数据库,失败了

PGError FATAL:  password authentication failed for user "app_user"
Run Code Online (Sandbox Code Playgroud)

这是以前的工作,当我用纯文本输入数据库密码,而不是试图通过它来访问它ENV['...'],但出于显而易见的原因,我想完全保留这个文件的实际密码(因此在代码库之外)同时仍然能够对文件进行其他非安全更改database.yml.

我缺少的语法有什么特别之处,或者database.yml在加载文件时由于某种原因环境变量不可用?

jef*_*unt 164

更新:有些人在评论中报告说这不适用于Rails 4.2.xx我自己没有尝试过,所以YMMV.


啊,终于找到了简单的解决方案 - 它接受嵌入式Ruby:

password: <%= ENV['APP_USER_POSTGRES_PASSWORD'] %>
Run Code Online (Sandbox Code Playgroud)

  • 耶稣基督,你不知道我花了多长时间检查并仔细检查我的密码.谢谢!我想我应该记住,YAML不是标记语言,而是erb. (5认同)

Fir*_*gon 23

如果您运行的是较新的Rails版本,请使用简短快速的解决方案!运行以下命令:

spring stop
Run Code Online (Sandbox Code Playgroud)

..然后运行rails console或其他rails命令.我的问题是需要重新启动Spring服务器以刷新/拾取我的新ENV变量.我正在启动Rails控制台,直到关闭Spring才能看到它们.

以前版本的Rails没有这个问题,因为他们没有使用Spring服务器.

另一个帮助您排除故障的工具 - 使用以下命令打印出您的database.yml配置.您可以从命令行运行它,但我更喜欢在Rails控制台中运行它,因为那时您可以使用awesome_print使其漂亮:

rails console:

puts ActiveRecord::Base.configurations
Run Code Online (Sandbox Code Playgroud)

...或使用awesome_print

ap ActiveRecord::Base.configurations
Run Code Online (Sandbox Code Playgroud)

或者从命令行:

bin/rails runner 'puts ActiveRecord::Base.configurations'
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么有人会拒绝这个答案.它完全有效(并且对我有用)+1 (2认同)
  • 我遇到了rails console和rails runner的问题,这都是因为弹簧重置是为了获取新的env变量所必需的!谢谢 ;) (2认同)