Rails 4.2 database.yml没有读取rbenv-vars变量

时间:2015-04-05 00:49:58

标签: ruby-on-rails rbenv

我的VPS安装了rbenv-vars,我在rails app里面的config目录中找到.rbenv-vars文件。我假装在其中加载数据库密码,但我做错了,因为rake db:create给了我一个无密码错误。当我把密码写成字符串时,Rake工作。

  

config / .rbenv-vars

DB_PASS=my_db_password

  

config / database.yml

  password: $DB_PASS                # Doesn't work
  #password: <%= ENV['DB_PASS'] %>  # Doesn't work
  # password: my_db_password        # Works

<小时/> 我让所有变量都运行rbenv vars

  

ssh&gt; rbenv vars

export DB_PASS='my_db_password'

3 个答案:

答案 0 :(得分:7)

通过https://github.com/rails/rails/issues/19256#issuecomment-102980786

您可能需要执行

spring stop

然后再试一次。这对我有用。

答案 1 :(得分:1)

我有同样的问题。我知道我的变量设置正确

$ rbenv vars
# /Users/dave/code/project/.rbenv-vars
export SQL_SERVER_HOST='10.0.0.1'
export SQL_SERVER_PORT='1433'
export SQL_SERVER_USERNAME='project'
export SQL_SERVER_PASSWORD='password'
export SQL_SERVER_DATABASE='project-development'

$ cat config/database.yml
development:
  adapter:  sqlserver
  host:     <%= ENV['SQL_SERVER_HOST'] %>
  port:     <%= ENV['SQL_SERVER_PORT'] %>
  username: <%= ENV['SQL_SERVER_USERNAME'] %>
  password: <%= ENV['SQL_SERVER_PASSWORD'] %>
  database: <%= ENV['SQL_SERVER_DATABASE'] %>
  mode:     dblib

结果:

$ rails c
Inside TinyTds#initialize with {:dataserver=>nil, :host=>nil, :port=>nil, :username=>nil, :password=>nil, :database=>nil, :tds_version=>nil, :appname=>"project", :login_timeout=>nil, :timeout=>nil, :encoding=>nil, :azure=>nil}
/Users/dave/code/project/.gems/bundler/gems/tiny_tds-afef8218c3c0/lib/tiny_tds/client.rb:65:in `initialize': missing :host option if no :dataserver given (ArgumentError)
...

也许是因为rbenv-vars尚未将变量加载到我的会话中?

有趣的是,当我将显式值放入config/database.yml时,它不会在rails服务器启动时初始化tiny_tds,而是在加载第一个模型时:

$ rails c
Loading development environment (Rails 4.2.2)
[1] pry(main)> # No TinyTds#initialize!!!
[2] pry(main)> User.first
Inside TinyTds#initialize with {:dataserver=>nil, :host=>"10.0.0.1", :port=>1433, :username=>"project", :password=>"password", :database=>"project-development", :tds_version=>nil, :appname=>"project", :login_timeout=>nil, :timeout=>nil, :encoding=>nil, :azure=>nil}
  SQL (0.6ms)  USE [project-development]
  User Load (3.7ms)  EXEC sp_executesql N'SELECT  [users].* FROM [users]  ORDER BY [users].[id] ASC OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY'
=> #<User:0x007fb8a0929fe0
 id: 1,
 ...

所以一旦启动了rails,rbenv-vars似乎工作正常,但在启动时却没有?

答案 2 :(得分:0)

我在环境变量SECRET_KEY_BASE中设置secrets.yml时出现了类似的问题guided to a solution by an rbenv developer。这是基本的解释:

  

通常,database.yml应该可以访问环境变量。   但是,为了清晰的沟通,让我们记住这一点   database.yml并不评估自己;相反,开始的过程   Rails加载database.yml并评估其中的变量。所以我的   问题是,谁/什么开始这个过程以及如何?

     

如何启动Rails应用并确定database.yml   被打破?您使用的是rails serverbundle exec,还是unicorn,还是   别的什么?对于您正在使用的命令,您可以运行which -a <command>并告诉我结果吗?

在我的情况下,我使用的是Apache和Passenger,所以可以通过在我的应用程序的Apache配置中添加以下内容来解决这个问题(即/etc/apache2/sites-available/my_app.conf):

  

PassengerRuby /home/my_username/.rbenv/shims/ruby