rake没有看到Rails.application.secrets

时间:2016-03-22 16:43:28

标签: ruby-on-rails ruby-on-rails-4 rake

简而言之:

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

    长期:

    当我跑步时

    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]无法解决问题。

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

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

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

    rails-4.2.2,Ubuntu LTS 14.04

1 个答案:

答案 0 :(得分:1)

我没有看到secrets.yml这样的 嵌套内容 ,而且release notes也没有这种类型。您可以使用以下代码

# 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 %>