如何在我从旧版本升级到3.1的Rails项目中启用资产管道?

时间:2012-10-25 20:48:35

标签: ruby-on-rails-3.1 asset-pipeline sprockets

我认为这与在创建的--skip-sprockets项目中启用资产管道相同 - 我可能会弄错。

我正在尝试运行rake assets:precompile进行测试,而且现在,因为我已经将require 'sprockets/railtie'添加到我的config / application.rb中 - 它至少找到了任务 - 但它说:

no such table: app_configs

更新:我发现这个错误来自我们的应用程序中名为AppConfig的模型 - 所以我正在研究那个部分。我不知道为什么它只在运行这个rake任务时发生...

更新:看起来这个特殊的rake任务假设我在生产环境中,即使我在我的开发环境中。其他rake任务似乎没有这个问题......?它表明它实际运行的任务是:/home/.../bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUP=assets

所以它没有找到表是有意义的,因为它正在查找错误的数据库(可能是一个甚至不存在的数据库)。但它如何(错误地)确定它是否在生产环境中?

1 个答案:

答案 0 :(得分:1)

事实证明:

我确实几乎正确地设置了资产管道:您只需运行rake rails:update以确保您的项目文件全部更新以与您当前的Rails gem(3.1.x)兼容。当它要覆盖文件时它会发出警告,你可以自己查看更改并编辑文件(不幸的是没有合并选项)。这些更改包括特定于资产管道的几个配置指令(在config目录中)。

我遇到的一个特殊问题是通过这篇文章解决的:How to build task 'assets:precompile' - (我不需要rails/all,所以我不得不添加链轮要求)

完成所有这些后,我遇到了生产环境问题。资产:预编译任务有意使用生产环境,以便生产生产就绪资产;如果您使用开发环境,它会根据environments/development.rb中的配置编译资产,而config/application.rb通常不包含摘要网址。这是故意的 - 问题是当它初始化生产环境时,它试图访问在开发环境中不存在的数据库。解决这个问题的方法(出于测试目的)是将其添加到config.assets.initialize_on_precompile = false文件中:

{{1}}

这可以防止它初始化应用程序和 voila ,在资产预编译期间不再出现初始化错误:) 但是:没有理由离开这个设置为false,除非您打算出于某种原因(例如Heroku)在非生产环境中预先包含所有资产,而不是在部署应用程序时允许Capistrano或其他部署工具在生产环境中编译它们。 initialize_on_precompile实际上允许您在资产模板中使用模型和其他应用程序资源,这可能是一个有用的功能。

另一个有用的帖子: Upgrading from Rails 3 to Rails 3.1