Rails 4 Asset Pipeline:来自js的asset_path中的资产缺失指纹

我正在部署一个Rails 4.0应用程序,其中包含HTML部分模板作为我们的前端JavaScript框架的资产。 虽然这些模板是资产管道的一部分并且已正确预编译,但当我在js文件中从嵌入式ruby调用asset_path时,它会返回没有指纹的模板路径。

我很确定这纯粹是一个资产管道问题,但为了让您对我们的技术堆栈有一个完整的认识:我们使用Rails 4.0,Ruby 2.1,AngularJS作为我们的前端MVC框架,以及AssetSync在Rails之间同步我们的资产和我们的CDN。

发生这种情况的一个示例(在app/assets/application.js.erb包含的文件中:

 $routeProvider .when('/', { templateUrl: "", controller: "HomeController" }); 

这在本地工作得很好,但是一旦生产中的config.assets.digest = true ,对asset_path的调用就不能正确地考虑指纹。 模板位于新子目录templates中的app/assets目录中。 因此,在上面的示例中,home.html资产位于app/assets/templates/home.html 。 我们的javascript本身已经预编译了,所以我认为这可能是资产预编译的顺序问题。

我注意到Rails Github上的一些问题( 1,2,3 )以及一些关于指纹未正确设置的SOpost( 1,2 ),但是找不到任何关于它们的信息。 ..

您可以提供的任何帮助或想法将非常感激。

编辑4月15日 :忘记包含我的应用程序javascript文件中的扩展名包括.erbapp/assets/application.js.erb )。 谢谢亚历克斯抓住这个。 我在上面更新了它。 另外,按照本文关于Heroku的说明 ,我确认在生产中运行的Rails控制台中运行puts helper.asset_path("home.html")打印该资产的正确指纹URL。

这似乎是AssetSync gem的一个问题。 我删除它,重新配置应用程序,以便Rails提供资产,指纹识别工作正常。

如果其他人发现此问题并遇到同样的问题,我建议不要使用AssetSync。 根据Heroku的说法:

 Many developers make use of Amazon's S3 service for serving static assets that have been uploaded previously, either manually or by some form of build process. Whilst this works, this is not recommended as S3 was designed as a file storage service and not for optimal delivery of files under load. Therefore, serving static assets from S3 is not recommended. 

Amazon CloudFront是通过CDN提供资产的首选方法,使用Rails应用程序非常容易配置,该应用程序提供自己的静态资产,实现与AssetSync相同的目标。

我对这些东西很陌生,但为了让asset_path工作,你不需要在该文件的末尾添加.erb吗?

有关详细信息,请查看本文的底部:

https://devcenter.heroku.com/articles/rails-4-asset-pipeline

如果它在开发中工作,那可能没有帮助。 不过,文章底部有一个关于调试的有用部分。

更新

这是另一篇可以提供帮助的文章:

https://medium.com/self-directed-learning/9ba1f595102a

在Heroku中翻转此配置使我的一些资产管道问题消失了:

 heroku labs:enable user-env-compile -a yourapp 

希望这可以帮助!

亚历克斯