5

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

Writing config/database.yml to read from DATABASE_URL

这意味着什么?这是 Cedar 堆栈的新功能吗?

我有一个机架应用程序。我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。这种变化在任何地方都有解释吗?

4

1 回答 1

8

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

Rails在加载该文件时通过 ERB 运行该文件,以允许各种动态选项。Heroku 利用这一点,生成一个 ERB 文件,该文件读取DATABASE_URL环境变量并创建.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 运行应该是无操作的,它将在 Heroku 上获取正确的值。

于 2012-09-12T01:40:33.227 回答