ActiveRecord 尝试使用 rbenv 连接到错误的数据库

ActiveRecord attempting to connect to the wrong database using rbenv

在站点根目录上执行获取请求时在 /log/production.log 中出现错误:

I, [2016-03-21T02:21:38.485274 #12750]  INFO -- :
    Started GET "/" for 174.xx.xxx.xxx at 2016-03-21 02:21:38 -0600
F, [2016-03-21T02:21:38.493250 #12750] FATAL -- :
    ActiveRecord::NoDatabaseError (FATAL:  database "y" does not exist)

它说 database "y" does not exist。首先,y 不是数据库,所以我知道它不存在。

其次,database.ymlydb 指定为应用程序应连接到的数据库 - 而不是 y

config/database.yml:

production:
  adapter: postgresql
  encoding: utf8
  host: <%= ENV['Y_PG_HOST'] %>
  database: <%= ENV['Y_PG_DB'] %>
  username: <%= ENV['Y_PG_USER'] %>
  password: <%= ENV['Y_PG_PASS'] %>

使用 rbenv 声明环境变量:

.rbenv-vars

  Y_PG_HOST=localhost
  Y_PG_DB=ydb
  Y_PG_USER=y
  Y_PG_PASS=*********

更新

感谢@Meshpi,看来 rbenv 是问题发生的地方。当环境变量直接放在 database.yml 中时,服务器按预期加载站点。

令人费解的是,从echo $Y_PG_DB开始,shellreturnsydb,而不是y

开发工作正常。甚至服务器上的 rails console production 也可以与 app.get '/' 一起工作,没有数据库错误。然而,当通过浏览器发出请求时,一切都乱套了。

问题是 Phusion Passenger 在安装结束时给出的说明与 rbenv-vars 不完全兼容。

在 Passenger 安装结束时,系统会指示您将以下内容添加到 nginx.conf

passenger_root /home/user/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/passenger-5.0.26;
passenger_ruby /home/user/.rbenv/versions/2.3.0/bin/ruby;

然而,作为@mislav pointed out,Ruby 脚本将直接启动 ruby 进程,而不是通过 rbenv。

要解决此问题,nginx.conf 中需要的是:

passenger_root /home/user/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/passenger-5.0.26;
passenger_ruby /home/user/.rbenv/shims/ruby;

希望这有助于拯救另一个毫无戒心的灵魂 :D