我已经做了一切:
的Gemfile:
gem 'rails_12factor', group: :production
配置/环境/ production.rb
config.serve_static_assets = true
配置/ application.rb中
config.assets.precompile += %w( *.css *.js )
我在vendor / assets /下有我的js和css文件。当我部署到heroku时,一切看起来都很好:
Running: rake assets:precompile
Asset precompilation completed (310.44s)
当我看到application-5c84e59d83c00fd13fb659edc18db24a.js和application-cb9661f49811aa5c8d103e83ee8747b2.css时,它们是空的
我做错了什么?
我读过:
Heroku does NOT compile files under assets pipelines in Rails 4
答案 0 :(得分:1)
我相信我找到了根本原因的问题。我选择将其作为新答案发布,因为它与我在上面发布的解决方案分开。
我构建并部署了一个空的新rails 4 app(这很有效)。通过区分production.rb
文件,我注意到非工作应用程序中有这样的行:
# Specifies the header that your server uses for sending files
# (comment out if your front-end server doesn't support this)
config.action_dispatch.x_sendfile_header = "X-Sendfile" # Use 'X-Accel-Redirect' for nginx
此配置行已在新的rails 4 app中注释掉。 Heroku文档推荐这个:
config.action_dispatch.x_sendfile_header = nil # For Heroku
当我改变这一点时,一切都按预期工作。
答案 1 :(得分:0)
这不是“真正的”解决方案,但Heroku将在运行时编译资产。请参阅this guide。
当然,默认情况下,在生产中,您的视图会使用摘要呈现通过帮助程序生成的任何asset_path(例如,在SASS中的image_tag()或styleheet_link_tag()或asset_path()等),这通常会获取适当的预编译文件。
但这已经破了,所以你可以关闭它,让rails在运行时编译资产。这显然要低得多,但如果您的唯一目标是让您的网站立即正常运行,那么这应该可行。
在production.rb
:
config.assets.digest = false
然后你的样式表链接应解析为类似/assets/application.css的东西,它应该可以工作(它在我的应用程序中完成)。但是,同样,这不是真正的解决方案,而是一种解决方法。如果您对实际的根本原因有任何牵引力,请告诉我。
答案 2 :(得分:0)
您可以通过将以下内容显式添加到application.rb
来解决此问题# config/application.rb
config.assets.paths << Rails.root.join('vendor', 'assets')
似乎虽然Rails确切知道它想要什么,但Heroku需要提醒将assets文件夹包含在资产路径中。