【问题标题】:Heroku assets uploaded, but urls to images not updatingHeroku 资产已上传,但图片的网址未更新
【发布时间】:2013-10-21 02:55:49
【问题描述】:

我最近将我的应用程序部署到了 heroku,除了 jquery-raty 中定义的图像之外,一切都运行良好。基本上,这个 gem 可以让你轻松地实现一个评级系统(视觉上)。

当我推送到 heroku 时,资产已预编译,我可以看到我指定用于 jquery-raty 的图像已成功编译并且名称已更改(即 image.png 变为 image-f96e0d1182b422c912116f08ac8f7d78.png)。一切都很好 - 但我发现当部署到 heroku 时,这个新名称没有反映出来。也就是说,图像正试图从https://myapp.herokuapp.com/assets/image.png 而不是https://myapp.herokuapp.com/assets/image-f96e0d1182b422c912116f08ac8f7d78.png 中提取。

这是我的问题——目前我不知道如何正确指向网址。

有没有其他人找到解决这个问题的方法??

谢谢。

【问题讨论】:

  • 你能发布你的项目目录结构吗?
  • 我知道文件存在于:myapp.herokuapp.com/assets/…。我可以访问该 URL 并查看图像。问题出在 jquery-raty 生成的 html 中,它不会更新 url
  • 我可以通过将奇数哈希“db77788e1a12d88ca2dcbc0117cc44cf”添加到 jquery-raty 文件名参数中的文件名上来完成这项工作。但这似乎是不安全的,因为每次资产管道编译时这些哈希都会改变——我不应该这样做。

标签: jquery ruby-on-rails image heroku


【解决方案1】:

您基本上遇到了使用 Rails 的资产管道预编译功能的陷阱之一,即您的图像和其他媒体将被赋予哈希值;并且这些资产的任何引用都必须是动态的以适应

您遇到的问题是,当您预编译资产时,.css 文件中的静态链接仅指向 url(/assets/image.png)。但是,您真正需要的是使用 asset_pathasset_url 帮助器动态呈现该链接

解决方案是SCSS

我们遇到了这个问题(我们使用asset sync gem),并发现解决它的最佳方法是使用 SCSS 动态呈现您的资产路径。这是我们的一些代码:

#app/assets/stylesheets/application.css.scss (yes, you should change it)
@import 'layout/fonts';

#app/assets/stylesheets/layout/fonnts.css.scss
@font-face {
    font-family: 'akagi';
    src: asset_url('fonts/akagi-th-webfont.eot');
    src: asset_url('fonts/akagi-th-webfont.eot?#iefix') format('embedded-opentype'),
         asset_url('fonts/akagi-th-webfont.woff') format('woff'),
         asset_url('fonts/akagi-th-webfont.ttf') format('truetype'),
         asset_url('fonts/akagi-th-webfont.svg#akagithin') format('svg');
    font-weight: 300;
    font-style: normal;
}

看看我们如何使用asset_url

这使 rake 能够在编译时定义资产的 路径,而不是旧路径;这意味着当您运行 rake assets:precompile 时,您将获得所有正确的引用。

每当我们编译资产时,我都会推荐使用这个预编译过程:

rake assets:precompile RAILS_ENV=production

...当你上传到 Heroku 时:

heroku run rake assets:precompile --app [your app]

【讨论】:

    【解决方案2】:

    如果您使用的是 Rails 4

    静态资产是在没有指纹的情况下引用的。因此,资产最终为 404。 从 Rails 4 开始,摘要选项默认设置为 false。 https://github.com/rails/rails/issues/11482

    虽然不是首选解决方案,但您可以尝试在 public 文件夹中同时包含已消化和未消化的资产。

    这可能会为您完成任务 - https://github.com/alexspeller/non-stupid-digest-assets

    你可能也想看看这个 https://github.com/rails/sprockets-rails/issues/49

    【讨论】:

    • 这个答案对于 jquery.raty.js 或任何类似的文件非常有用,其中在 js 文件中引用了图像。
    【解决方案3】:

    感谢@Rich Peck、@swap.nil 和其他人回答我的问题。在昨天搞砸了几个小时之后,我决定做我应该做的事情,阅读这个页面The Assets Pipeline

    ...基本上@Rich Peck 提到的使用动态呈现的 URL 是关键。为此,我只需将 .js.coffee 文件更改为 .js.coffee.erb 文件,并使用 "<%= asset_path('my-image.png') %>" 为文件呈现适当的 URL。一旦我这样做了,一切正常。我不需要对手动预编译资产做任何事情——我仍然让 heroku 自动为我做这件事。

    再次感谢大家对解决这个问题的支持:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-16
      • 2016-05-28
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      相关资源
      最近更新 更多