未读取 database.yml 中的 ENV 变量(Rails 4.2.0、RubyMine 7、Postgres、Ruby 2.2.0、DotEnv)

Posted

技术标签:

【中文标题】未读取 database.yml 中的 ENV 变量(Rails 4.2.0、RubyMine 7、Postgres、Ruby 2.2.0、DotEnv)【英文标题】:Not reading ENV variables in database.yml (Rails 4.2.0, RubyMine 7, Postgres, Ruby 2.2.0, DotEnv) 【发布时间】:2015-05-11 07:30:15 【问题描述】:

我正在尝试使用 RubyMine (7.0.4) 使用 PostgreSQL (9.3) 设置一个简单的 rails 应用程序(4.2.0,ruby 2.2.0);我计划部署到 Heroku。

我有两个问题:

首先(更重要的是),我的 ENV 变量在我的 database.yml 文件中不起作用。

其次,RubyMine 根本无法识别该文件中的 erb。

database.yml

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

development:
  <<: *default
  database: my_app_development

test:
  <<: *default
  database: my_app_test

production:
  <<: *default
#  database: my_app_production
#  username: <%= ENV['DB_USERNAME'] %>
#  password: <%= ENV['DB_PASSWORD'] %>
  url: <%= ENV['DATABASE_URL'] %>

database.env

(我正在使用 dotenv-rails gem):

DB_USERNAME=my_app
DB_PASSWORD=password

编辑:我也试过了

export DB_USERNAME=myapp, DB_USERNAME="my_app"export DB_USERNAME="myapp"

宝石文件

...
group :development, :test do
  ...
  # Shim to load environment variables from .env into ENV in development.
  gem 'dotenv-rails'
end

我在 RubyMine 中收到一个错误,提示我无法连接到我的数据库,因为

指定的用户名和密码组合被拒绝:FATAL: password authentication failed for user "%=...

在终端中,我得到PG::ConnectionBad: FATAL: password authentication failed for user "lee"(我的本地用户名),但显式传递变量(rake db:create DB_USERNAME=...)有效。

我尝试将用户名和密码直接放入文件中:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: my_app
  password: password 

成功!由于问题不是我的用户名和密码,我决定尝试一些基本的嵌入式 ruby​​:

default: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  username: <%= "my_app" %>
  password: <%= "password" %> 

RubyMine 运气不好 - FATAL: password authentication failed for user "%=...。但是,这确实适用于来自终端的rake db:create

所以,我的两个问题是:

为了使 ENV 变量起作用,我缺少哪一步? 如何使配置与 RubyMine 一起工作?

编辑:第一部分已解决

显然,在 Rails 4.2 中,加载顺序不同(根据文档,Dotenv 曾经在 application.rb 中的 class Application &lt; Rails::Application 之后立即加载)。

通过在我的 application.rb 文件中添加两行以更早地加载 Dotenv 解决了这个问题:

...
Bundler.require(*Rails.groups)

##### START ADDED CODE #####

Dotenv::Railtie.load
HOSTNAME = ENV['HOSTNAME']

##### END ADDED CODE #####

module MyApp
  class Application < Rails::Application
  ...

我仍在试图弄清楚如何让 RubyMine 识别 database.yml 中嵌入的 ruby​​,尽管现在该应用程序可以通过命令行正常工作。

【问题讨论】:

RubyMine 尝试连接到数据库,但失败会报错,是吗? 我不确定我是否理解你的问题,但我得到的错误是:FATAL: password authentication failed for user "%= ENV['DB_USERNAME'] %" 【参考方案1】:

username: &lt;%= ENV.fetch("DB_USERNAME") %&gt; 为我工作

【讨论】:

【参考方案2】:

Heroku 要求您在 Heroku 仪表板 -> 设置 -> 配置变量中设置一些环境变量

这些包括:

适配器 数据库 用户名 密码 主持人 端口

https://devcenter.heroku.com/articles/rails-database-connection-behavior#configuring-connections-in-rails-4-1

【讨论】:

【参考方案3】:

这可能是加载问题。将 dotenv gem 放在 pg gem 之前。

【讨论】:

这是一个 RubyMine 问题,而不是 Ruby 问题。 rails server等可以读取嵌入的ruby没问题;只是 RubyMine 数据库工具没有执行它。不过我不再使用 RubyMine,所以我不确定它是否仍然是个问题。

以上是关于未读取 database.yml 中的 ENV 变量(Rails 4.2.0、RubyMine 7、Postgres、Ruby 2.2.0、DotEnv)的主要内容,如果未能解决你的问题,请参考以下文章

如何在database.yml文件中设置rails环境变量?

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

如何在 database.yml 文件中设置 rails 环境变量?

带有 gitlab CI/CD 的 Rails .env

Rails Rake ENV 变量始终为空

database.yml 中的 pool 选项有啥用