部署环境:
Ubuntu Server 12.04
Postgresql 9.1
Rails 3.2.14
Capistrano 2.13.5
其中:pg_hba.conf
文件中描述如下:
local all postrgesql truse
local all all md5
local all 127.0.0.1/32 md5
local all ::1/128 md5
config/deploy.rb
中有一行:
run "cd #{latest_release} && #{rake} RAILS_ENV=#{rails_env} #{asset_env} assets:precompile"
在远程执行cap staging:deploy
时,运行到上面那行代码就会报错,提示无法连接数据库,在Active Record
初始化时出现错误。
当时我注释掉那一行,ssh到服务器上,直接cd到项目中执行预编译,也能成功,不会出现错误。
后来我在config/application.rb
中加上了:
config.assets.initialize_on_precompile = false
# Heroku中部署Rails3.2程序也有这个要求
最终问题解决。
我的问题是:Rails3.2程序在production
环境中执行预编译的时候,真的有初始化Active Record
这一步么,以及为什么?
此配置项的作用正是在执行
asset:precompile
不初始化App。初始化Active Record
属于初始化整个APP的一部分。Rails Guides中有说:
意即如果设置成
false
,可能导致在编译部分文件时出现Bug(例如:内嵌的erb语句<%= something... %>
)。建议在部署前测试。