我正在部署一个Rails 4.0应用程序,其中包含HTML部分模板作为我们的前端JavaScript框架的资产。虽然这些模板是资产管道的一部分并且已正确预编译,但当我从js文件中的嵌入式ruby调用asset_path
时,它会返回模板的路径,而不用指纹。
我很确定这纯粹是一个资产管道问题,但为了让您对我们的技术堆栈有一个完整的认识:我们使用Rails 4.0,Ruby 2.1,AngularJS作为我们的前端MVC框架,以及{{3}在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上的一些问题(AssetSync,1,2)以及一些关于未正确设置指纹的SO帖子{{3} },3),但找不到任何关于它们的信息......
非常感谢您提供的任何帮助或想法。
编辑4/15 :忘记在我的应用程序JavaScript文件中包含.erb
(app/assets/application.js.erb
)的扩展名。谢谢亚历克斯抓住这个。我已在上面更新了它。
另外,按照1中的说明,我确认在生产环境中运行的Rails控制台中运行puts helper.asset_path("home.html")
会为该资产打印一个正确的指纹URL。
答案 0 :(得分:1)
这似乎是AssetSync gem的一个问题。我删除了它,重新配置了应用程序,以便Rails为资产提供服务,指纹识别工作正常。
如果其他人发现此问题并遇到同样的问题,我建议不要使用AssetSync。根据{{3}}:
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.
Heroku是通过CDN提供资产的首选方法,并且很容易使用Rails应用程序进行配置,该应用程序提供自己的静态资产,实现与AssetSync相同的目标。
答案 1 :(得分:0)
我对这些东西很陌生,但为了让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
希望这有帮助!
亚历