乘客忽视RAILS_ENV

时间:2017-01-03 21:43:09

标签: ruby-on-rails rails-activerecord passenger ruby-on-rails-5

背景

我有一个带有各种变量的env文件,我的Rails应用程序依赖它,包括RAILS_ENV,它被初始化为此文件中的开发。我还获得了database.yml文件,为我的环境定义了数据库连接(如下)。当我运行rails控制台时,一切看起来都应该如此。检查Rails.configuration.database_configuration[Rails.env]会返回以下内容:

{"adapter"=>"postgresql",
"encoding"=>"utf8",
"database"=>"dev",
"username"=>"rails",
"password"=>"***",
"host"=>"localhost",
"pool"=>5,
"timeout"=>5000}

然而,当我尝试访问该应用程序时,我得到502并记录以下错误:

  

Rack应用程序对象中的异常ActiveRecord :: NoDatabaseError(FATAL:数据库" prod"不存在。

显然,错误信息是准确的,但并不代表我期望发生的事情。

我认为这是一个Passenger / Apache问题,因为运行rails console一切都很开心。

注意:我已经在其他帖子中看到了这一点,所以没有 - 没有DATABASE_URL环境变量在database.yml覆盖事物的周围。

我尝试过的事情

  1. .bashrcPassenger is supposed to source the bashrc for the user apache is running as,后者又设置为提供相关的env文件。
  2. /etc/sysconfig/httpd:我尝试直接从Apache配置手动获取文件,并在脚本运行时通过将env转储到文件进行验证,正确的值使其进入env,但是这也没有改变破碎的行为。
  3. 的database.yml

    development:
      adapter: postgresql
      encoding: utf8
      database: dev
      username: rails
      password: <%= ENV['RAILS_DB_PWD'] %>
      host: <%= ENV['RAILS_DB_HOST'] %>
      pool: 5
      timeout: 5000
    
    # Warning: The database defined as "test" will be erased and
    # re-generated from your development database when you run "rake".
    # Do not set this db to the same as development or production.
    test:
      adapter: postgresql
      encoding: utf8
      database: test
      username: rails
      password: <%= ENV['RAILS_DB_PWD'] %>
      host: <%= ENV['RAILS_DB_HOST'] %>
      pool: 5
      timeout: 5000
    
    production:
      adapter: postgresql
      encoding: utf8
      database: prod
      username: rails
      password: <%= ENV['RAILS_DB_PWD'] %>
      host: <%= ENV['RAILS_DB_HOST'] %>
      port: 5432
      pool: 5
      timeout: 5000
    

1 个答案:

答案 0 :(得分:0)

更好的方法是使用DATABASE_URL env var。

  

如果你同时设置了config / database.yml和ENV['DATABASE_URL']   Rails会将配置合并在一起   Rails Guides: Configuring a Database

common: &common
  adapter: postgresql
  encoding: utf8
  template: template0 # Required for UTF8 encoding
  pool: 5
  timeout: 5000

development:
  <<: *common
  database: dev

test:
  <<: *common
  database: test

production:
  <<: *common
  database: prod

我通常建议您避免在database.yml中指定数据库用户名和密码。使用ENV vars Luke!虽然你已经到了中途,但最好坚持使用约定而不是引入单独的变量。

  

对应用程序是否正确分析了所有配置的试金石   代码是代码库是否可以在任何时候开源   一刻,没有妥协任何凭据。   https://12factor.net/config