【问题标题】:Rails 4; asset helper not pointing to fingerprinted image asset (failure to load in production @ Heroku)导轨 4;资产助手未指向指纹图像资产(无法在生产中加载@Heroku)
【发布时间】:2014-02-20 04:36:06
【问题描述】:

这个问题快把我逼疯了……我想我已经尝试了 Sass 文件、ERB 文件、资产助手、图像助手等的所有可能的组合。请给我新的想法!

上下文:

Rails 应用程序需要使用资产助手,以便在预编译资产时,源代码将是一个指纹资产文件。即,如果您只是调用 img src="X.jpg",则生产中的站点会查找 X.jpg,但 public/assets 中的文件实际上已被指纹识别为 X-as;diofua;wemfiwaejfoiawefo.jpg。获取该指纹文件的唯一方法是使用资产助手,例如 image_url ('X.jpg')。

现在在我的实时站点中,我正在使用资产助手,但无论出于何种原因,它都没有指向指纹资产。请注意,资产是在开发中找到的(但同样,这是因为在开发中没有添加指纹)。

代码

标题为“classic-map.png”的图片,位于 app/assets/images/galleria

从 application.css 文件中所需的 css.erb 文件调用图像。在 css.erb 文件中,我有以下代码:

background-image: url(<%= asset_path 'galleria/classic-map.png' %>);

供参考,http://guides.rubyonrails.org/asset_pipeline.html 请注意,我选择将其编写为 css.erb 文件,因此使用asset_path 与asset-path。另外,我最初认为问题可能出在插值上,但在页面源代码中,url 确实有效,只是它指向 url(galleria/classic-map.png) 而不是 url(galleria/classic-地图-apsoidufalskjf;kasj.png)

向能提供帮助的人致敬!

【问题讨论】:

  • 尝试一次 background-image:asset_url('galleria/classic-map.png');
  • 没有没有用,注意我刚刚编辑了我的问题,但这在开发中有效,所以代码看起来是正确的,只是资产助手似乎出于某种原因没有指向指纹资产在生产中
  • @james 你有没有找到解决这个问题的方法?
  • 我找到了一个 hack @Noz,刚刚添加了答案。

标签: css ruby-on-rails heroku asset-pipeline


【解决方案1】:

不管怎样,这又发生了,这一次我不能使用 hack,因为我迫切需要指纹。所以不知何故,神奇地,我运行了 rake assets:clobberheroku run rake assets:clobber 来清理所有资产,然后直接运行 git push 来强制 Heroku 为我进行预编译。这样做了,一切正常。

现在,当这种情况发生时,我会在本地和生产环境中破坏资产并推送,从而迫使 Heroku 远程预编译。类似于@user2880239 的回答。我已经停止在本地预编译并检查到 git。

【讨论】:

  • 这行得通。排序的。 rake assets:clobber 在我的情况下没有以某种方式删除 public/assets,所以我手动删除它,然后强制推送。这就是解决方案,这太荒谬了。
【解决方案2】:

我与一位仍然无法帮助我解决此问题的高级 Rails 开发人员坐在一起。但是我们最终使用的解决方法是我们只是手动删除了公用文件夹中的资产指纹(因为指纹是资产助手所指向的)。

即文件galleria/classic-map-587854758918434124.png我们刚刚手动改回galleria/classic-map.png,它工作正常。

请注意,如果您执行此“破解”操作,下次您预编译资产时,Rails 将创建另一个指纹资产,因此除非您每次都想继续删除额外的指纹资产,否则您会有重复。对我来说,我不在乎重复,我在乎不再考虑这个。

【讨论】:

    【解决方案3】:

    你检查过 RAILS_ENV 吗?

    bundle exec rake assets:precompile RAILS_ENV=production
    

    【讨论】:

      【解决方案4】:

      我遇到了和你一样的问题。 This blog post 帮助了我。

      我所做的是在我的config/environments/production.rb 文件中更改了一些内容,即...

      config.serve_static_assets = true
      config.action_dispatch.x_sendfile_header = ‘X-Accel-Redirect’
      config.assets.compile = true
      

      请注意,您可能不需要“添加”任何这些属性,因为它们可能已预先设置为 false 或仅被注释掉。

      然后我跳了heroku舞:

      rake assets:precompile
      git add .
      git commit -m "Fix static assets"
      git push
      git push heroku
      

      【讨论】:

      • 我不建议预编译资产并将它们签入您的 git 存储库。像图像这样的二进制文件确实会在 git 历史记录中积累,并随着时间的推移增加 repo 的大小,尤其是在清除预编译的资产缓存时。不过,您帖子的第一部分很有帮助!
      【解决方案5】:

      我也有同样的问题。我什至从heroku的rails控制台尝试了助手,助手在那里工作正常!!

      $ heroku run rails console
      Running `rails console` attached to terminal... up, run.8071
      Loading production environment (Rails 4.1.7)
      
      irb(main):001:0> puts helper.image_path("bg.jpg")
      /assets/bg-00acfb7dbe138102509d82ac2313c24d.jpg
      

      我的最终“解决方案”是更新 config/environments/production.rb 中的 config.assets.compile = true 以回退到非指纹图像。

      希望此解决方案对某人有所帮助。如果您有任何真正的解决方案,请告诉我!

      【讨论】:

      • "更新 config/environments/production.rb 中的 config.assets.compile = true 以回退到非指纹图像。"你能解释一下你是如何让它回退的吗?
      【解决方案6】:

      Heroku 的答案在他们的 Pipeline 文档here 中。

      通过执行clobber,您基本上是在每次部署代码时都缓存清除所有资产并强制所有客户端重新加载所有静态资产(即使它们没有更改)。这是不可取的,因为这意味着每次部署所有客户端时都会经历缓慢的加载时间,直到所有资产再次被缓存。

      您的 css 文件依赖于您的图像文件,因此您需要通过将其放在 css 顶部来告知资产管道:

      //= depend_on_asset "galleria/classic-map.png"
      

      这告诉 sprockets 如果 class-map.png 获得了新的指纹,那么 css 也必须获得新的指纹。所以它只会重新编译文件(以及改变的依赖项)。

      对于其他登陆这里的人,请注意,如果您在视图以外的任何地方(例如在模型中)使用asset_path,则需要预先添加完整的上下文:

      ActionController::Base.helpers.asset_path('your-image.png')
      

      更多信息here

      【讨论】:

        猜你喜欢
        • 2021-08-10
        • 1970-01-01
        • 1970-01-01
        • 2015-02-12
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多