Rails 4 资产管道:js 中的 asset_path 缺少指纹
我正在部署一个Rails 4.0应用程序,其中包括HTML部分模板作为前端JavaScript框架的资产。虽然这些模板是资产管道的一部分,并且已经正确地预编译了,但是当我在嵌入式Ruby中从我们的js文件中调用asset_path
时,它返回我们的模板的路径没有指纹。
我非常确定这纯粹是一个资产管道的问题,但是为了让您完全了解我们的技术栈:我们使用Rails 4.0,Ruby 2.1,AngularJS作为我们的前端MVC框架,以及AssetSync将我们的资产在Rails和CDN之间同步。
以下是一个示例(在app/assets/application.js.erb
中包含的文件中):
$routeProvider
.when('/', {
templateUrl: "<%= asset_path 'home.html' %>",
controller: "HomeController"
});
这在本地工作得很好,但是一旦在生产中设置了config.assets.digest = true
,对asset_path
的调用就无法正确考虑到指纹。这些模板位于app/assets
目录中的一个新子目录templates
中。因此,在上面的示例中,home.html资产位于app/assets/templates/home.html
。此时我们的JavaScript已经预编译,所以我认为这可能是预编译资产的顺序问题。
我注意到Rails Github上有一些问题(1,2,3),以及一些SO帖子关于指纹未正确设置(1,2),但找不到任何关于它们完全不包括的信息...
任何您可以提供的帮助或想法都将不胜感激。
编辑4/15:忘记包括我的应用程序JavaScript文件的扩展名.erb
(app/assets/application.js.erb
)。感谢Alex注意到了这一点。我已经更新了上面的内容。
此外,遵循Heroku上的这篇文章的说明,我确认从在生产中运行的Rails控制台中运行puts helper.asset_path("home.html")
会打印出该资产的正确指纹URL。
我对这些东西还很陌生,但要让asset_path起作用,难道文件结尾不需要加. erb吗?
查看本文底部以获取更多信息:
https://devcenter.heroku.com/articles/rails-4-asset-pipeline
如果在开发中有效,那可能没有帮助。不过文章的底部有一个有用的调试部分。
更新
这里有另一篇文章可能有所帮助:
https://medium.com/self-directed-learning/9ba1f595102a
在Heroku中启用此配置可以解决我的一些asset pipeline问题:
heroku labs:enable user-env-compile -a yourapp
希望这可以帮助你!
Alex
这似乎是与 AssetSync gem 有关的问题。我将其删除,重新配置了应用程序,使Rails服务于资产,并且指纹识别正常工作。
如果其他人发现此问题并遇到相同的问题,我建议不要使用 AssetSync。根据 Heroku 的说法:
Amazon CloudFront 是通过 CDN 提供资产的首选方法,并且对于使用自己的静态资产服务的 Rails 应用程序非常容易配置,实现与 AssetSync 相同的目标。