为什么我的heroku应用程序在资产编译期间尝试连接到数据库?

时间:2012-12-31 14:07:32

标签: ruby-on-rails heroku asset-pipeline

我最近放了一个Rails应用程序,我一直在研究Heroku。当我推送到我的Heroku git存储库时,它会运行资产编译作为生成slug的一部分。它失败了,出现以下错误:

could not connect to server: Connection refused
Is the server running on host "127.0.0.1" and accepting
TCP/IP connections on port xxxx?

问题是rake任务rake assets:precompile正在尝试连接到数据库,而我的应用程序在slug编译期间无法访问配置变量。我在Heroku的troubleshooting documentation中找到了此信息,并在我的application.rb文件中添加了规定的修复:

config.assets.initialize_on_precompile = false

现在我的资产被正确编译,我宝石的供应商/资产中的图像可用。

问题

  1. 为什么资产编译rake任务首先尝试连接数据库?
  2. Heroku还允许在本地编译资产并将其添加到git仓库或运行时。我相信这两个选项不会遇到同样的问题,因为它只发生在slug编译过程中。这两种方法都有任何优势吗?

2 个答案:

答案 0 :(得分:1)

  1. 该任务可能依赖于:environment,这将加载整个应用程序,包括建立数据库连接的启动代码。

  2. 资产预编译的目的是改善请求时间 - rails不必在每次请求时编译资产。如果您在本地编译资产,则使用自己的计算机,这很可能比heroku环境更快。您可以轻松地使用钩子自动进行编译。

答案 1 :(得分:0)

config.initialize_on_precompile告诉rake是否在资产编译任务期间加载完整的rails应用程序,包括连接到数据库。至于在本地编译,不,这样做没有多大好处。