当我的应用程序基于Heroku构建时,它说
Writing config/database.yml to read from DATABASE_URL
这是什么意思?这是Cedar堆栈的新功能吗?
我有一个Rack应用程序。我的config.ru
曾经在Barmy Bamboo堆上工作:
#!/usr/bin/ruby
environment = ENV['DATABASE_URL'] ? 'production' : 'development'
require './pb.rb'
dbconfig = YAML.load(File.read('config/database.yml'))
Pb::Models::Base.establish_connection dbconfig[environment]
Pb.create if Pb.respond_to? :create
run Pb
在我自己的计算机上,它将读取我的本地config/database.yml
(未提交源代码管理)
development:
adapter: sqlite3
database: db/development.sqlite3
pool: 5
timeout: 5000
在Heroku上它会读到Heroku的database.yml
。现在在Cedar heroku run cat config/database.yml
上检查它,它似乎是一个Ruby文件,而不是yml。这个变化是在任何地方解释的吗?
答案 0 :(得分:8)
当您将应用推送到Heroku时,如果您有一个config
目录,Ruby build pack writes a new database.yml
file,并生成您看到的消息。
Rails runs this file through ERB when loading it,允许各种动态选项。 Heroku使用它,生成一个读取DATABASE_URL
环境变量的ERB文件,并创建指向该数据库的approppriate .yml
文件。
我假设在Bamboo的情况下,创建的database.yml
是一个指向数据库的普通Yaml文件(我找不到任何引用)。
要使您的应用程序在Cedar上运行,您需要以与Rails相同的方式通过ERB运行该文件。改变这个:
dbconfig = YAML.load(File.read('config/database.yml'))
到
require 'erb'
dbconfig = YAML.load(ERB.new(File.read('config/database.yml')).result)
如果您的本地database.yml
只是简单的yaml,那么像这样运行ERB应该是一个no-op,它将在Heroku上获取正确的值。