Rails 4;资产助手没有指向指纹图像资产(无法在生产中加载@ Heroku)

时间:2014-02-20 04:36:07

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

这个问题让我发疯了......我想我已经尝试过Sass文件,ERB文件,资产助手,图片助手等各种可能的组合。有人请给我新的想法!

上下文

Rails应用程序需要使用资产助手,以便在预编译资产时,源将是指纹资产文件。即,如果您刚刚调用img src =“X.jpg”,生产中的网站将查找X.jpg,但公共/资产中的文件实际上已被指纹化为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(galleria / classic-map.png)而不是url(galleria / classic-地图apsoidufalskjf; kasj.png)

对任何可以提供帮助的人都有一百万的荣誉!

6 个答案:

答案 0 :(得分:4)

对于它的价值,这恰好是AGAIN,这次我无法使用黑客,因为我迫切需要指纹。所以,不知何故,奇迹般地,我运行了rake assets:clobberheroku run rake assets:clobber来清理所有资产,然后直接git push迫使Heroku为我进行预编译。这样做了,一切正常。

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

答案 1 :(得分:1)

我和一位Sr Rails开发人员坐在一起,他仍然无法解决这个问题。但我们最终使用的解决方法是,我们只是手动删除了公共文件夹中的资产指纹(因为指尖是资产助手要指向的内容)。

即,文件galleria/classic-map-587854758918434124.png我们只需手动更改回galleria/classic-map.png,就可以了。

请注意,如果您执行此操作'hack',则下次预编译资产时,Rails将创建另一个指纹资产,因此除非您希望每次都删除其他指纹资产,否则您将进行复制。对我来说,我不关心重复,我不在乎不再考虑这个。

答案 2 :(得分:1)

您检查过RAILS_ENV吗?

bundle exec rake assets:precompile RAILS_ENV=production

答案 3 :(得分:0)

我遇到了同样的问题。 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

答案 4 :(得分:0)

我遇到了同样的问题。我甚至从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.assets.compile = true中的config/environments/production.rb以回退到非指纹图像。

希望这个解决方案可以帮助某人。如果你有任何真正的解决方案,请告诉我!

答案 5 :(得分:0)

Heroku对此的答案在其管道文档here中。

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

您的css文件与您的图片文件具有依赖性,因此您需要通过将其放在css的顶部来告诉资产管道有关此问题:

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

这告诉链轮,如果class-map.png获得新的指纹,则CSS也必须获得新的指纹。因此,它将仅重新编译文件(以及已更改的依赖项)。

对于在这里着陆的其他人,请注意,如果您使用的不是视图(例如模型)中的任何其他位置的asset_path,则需要添加完整的上下文:

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

更多信息here