Heroku什么'写配置/ database.yml从DATABASE_URL读取'是什么意思?

Col*_*nic 5 heroku

当我的应用程序基于Heroku构建时,它说

Writing config/database.yml to read from DATABASE_URL
Run Code Online (Sandbox Code Playgroud)

那是什么意思?这是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
Run Code Online (Sandbox Code Playgroud)

在我自己的计算机上,它将读取我的本地config/database.yml(不承诺源代码控制)

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000
Run Code Online (Sandbox Code Playgroud)

在Heroku上,它会读到Heroku的database.yml.现在在Cedar上检查它heroku run cat config/database.yml,它似乎是一个Ruby文件,而不是yml.这个变化在任何地方解释了

mat*_*att 8

当您将应用程序推送到Heroku时,如果您有一个config目录,则Ruby构建包会写入一个新database.yml文件,并生成您看到的消息.

Rails 在加载时通​​过ERB运行此文件,以允许各种动态选项.Heroku使用它,生成一个读取DATABASE_URL环境变量的ERB文件,并创建.yml指向该数据库的approppriate 文件.

我假设在Bamboo的情况下database.yml创建的是一个指向您的数据库的简单Yaml文件(我找不到任何引用).

要让您的应用程序在Cedar上运行,您需要以与Rails相同的方式通过ERB运行该文件.改变这个:

dbconfig = YAML.load(File.read('config/database.yml'))
Run Code Online (Sandbox Code Playgroud)

require 'erb'
dbconfig = YAML.load(ERB.new(File.read('config/database.yml')).result)
Run Code Online (Sandbox Code Playgroud)

如果你的本地database.yml只是简单的yaml,那么像这样运行ERB应该是一个no-op,它将在Heroku上获得正确的值.