Rails 4 资产管道:js 中的 asset_path 缺少指纹

IT小君   2023-05-12T08:25:15

我正在部署一个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上有一些问题(123),以及一些SO帖子关于指纹未正确设置(12),但找不到任何关于它们完全不包括的信息...

任何您可以提供的帮助或想法都将不胜感激。

编辑4/15:忘记包括我的应用程序JavaScript文件的扩展名.erbapp/assets/application.js.erb)。感谢Alex注意到了这一点。我已经更新了上面的内容。 此外,遵循Heroku上的这篇文章的说明,我确认从在生产中运行的Rails控制台中运行puts helper.asset_path("home.html")会打印出该资产的正确指纹URL。

评论(2)
IT小君

这似乎是与 AssetSync gem 有关的问题。我将其删除,重新配置了应用程序,使Rails服务于资产,并且指纹识别正常工作。

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

许多开发人员使用亚马逊的S3服务来提供之前已经上传的静态资产,无论是手动上传还是通过某种构建过程。
虽然这种方法可以工作,但不建议使用,因为S3是作为文件存储服务而设计的,而不是为了在负载下优化文件传递。因此,不建议从S3提供静态资产。

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

2023-05-12T08:25:37   回复
IT小君

我对这些东西还很陌生,但要让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

2023-05-12T08:25:57   回复