【问题标题】:Rails 4 Asset Pipeline: Asset missing fingerprint in asset_path from jsRails 4 Asset Pipeline:来自js的asset_path中的资产缺少指纹
【发布时间】:2014-04-14 22:30:20
【问题描述】:

我正在部署一个 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: "<%= asset_path 'home.html' %>",
      controller: "HomeController"
    });

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

我注意到 Rails Github 上的一些问题(123)和一些关于指纹设置不正确的 SO 帖子(12),但是找不到任何关于他们根本不包括在内的信息...

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

编辑 4/15:忘记包含我的应用程序 javascript 文件中的扩展名包含 .erb (app/assets/application.js.erb)。感谢亚历克斯抓住了这一点。我已经在上面更新了。 另外,按照this article on Heroku 中的说明,我确认在生产环境中运行的Rails 控制台中运行puts helper.asset_path("home.html") 会打印该资产的正确指纹URL。

【问题讨论】:

    标签: ruby-on-rails angularjs ruby-on-rails-4 asset-pipeline


    【解决方案1】:

    这似乎是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 相同的目标。

    【讨论】:

    • 这并不是一个真正的答案,而是一个不需要回答问题的论点,因为您不应该重写 url 以指向 S3。我遇到了同样的问题,我正在使用“asset_sync”上传到 S3,然后从 Cloudfront 提供服务。 “asset_url”标签不会重写我的 URL 以指向 Cloudfront,但目前我还不确定问题出在“asset_sync”gem 还是 Rails 上。我不明白为什么“asset_sync”应该能够破坏资产编译。
    【解决方案2】:

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

    希望这会有所帮助!

    亚历克斯

    【讨论】:

    • 感谢 Alex 捕捉到这一点 - 我确实在该文件上使用了 .erb,所以它是 application.js.erb,但我忘记在问题中包含它。你完全正确,它需要有.erb,我已经更新了我的问题以反映这个扩展。
    • 另外,感谢文章的链接。当我按照建议在 Heroku 上运行的 Rails 控制台中运行 puts helper.asset_path("home.html") 时,我得到了正确的指纹资产路径
    • 感谢您对文章的更新。我使用的是user-env-compile 实验室,但 Heroku 最近弃用了该实验室,并默认包含了它的功能。见here
    猜你喜欢
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多