耙子没看到 Rails.application.secrets

rake not seeing Rails.application.secrets

简而言之:

  1. rake 似乎无法访问 config/database.yml 文件中的 Rails.application.secrets
  2. config/secrets.yml的目的是什么?

长:

当我运行

RAILS_ENV=production rake db:migrate

我收到错误 Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO),尽管我在 config/database.yml 中指定了适当的值并且连接的用户不应该是 'root'。这是相应配置文件的摘录:

# config/database.yml
production:
  <<: *default
  adapter: mysql2
  host: localhost
  database: <%= Rails.application.secrets[:database][:name] %>
  username: <%= Rails.application.secrets[:database][:username] %>
  password: <%= Rails.application.secrets[:database][:password] %>

# config/secrets.yml
production:
  secret_key_base: very-long-blah-blah-blah
  database:
    name: app_db_name
    username: app_db_user
    password: app_db_password

似乎 rake 无法访问 Rails.application.secrets。 运行 当我在 database.yml 中显式输入必要的值时迁移成功,例如,如下:

production:
  <<: *default
  adapter: mysql2
  host: localhost
  database: <%= Rails.application.secrets[:database][:name]  || 'app_db_name' %>
  username: <%= Rails.application.secrets[:database][:username] || 'app_db_user' %>
  password: <%= Rails.application.secrets[:database][:password] || 'app_db_password' %>

以上证明Rails.application.secrets[:database][:name]无解

如何在 rake 中访问 Rails.application.secrets?这是正确的解决方案吗?

我知道我可以使用ENV[VARNAME]来填写config/database.yml的秘密部分。但是 config/secrets.yml 文件的目的是什么?

此外,我正在使用 Passenger,这意味着 Web 服务器可能无法访问 .bashrc 中的变量(我在 secret_key_base 中遇到了这个问题)。因此我尽量避免使用环境变量。只是不想让我所有的秘密都泄露到整个服务器。

rails-4.2.2,Ubuntu LTS 14.04

我还没有看到像您这样的嵌套内容 secrets.yml,[=14= 】 没有这种。您应该可以使用以下代码

# config/secrets.yml
production:
  secret_key_base: very-long-blah-blah-blah
  name: app_db_name
  username: app_db_user
  password: app_db_password

并且在 database.yml

# config/database.yml
production:
  <<: *default
  adapter: mysql2
  host: localhost
  database: <%= Rails.application.secrets.name %>
  username: <%= Rails.application.secrets.username %>
  password: <%= Rails.application.secrets.password %>