这个问题让我发疯了......我想我已经尝试过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)
对任何可以提供帮助的人都有一百万的荣誉!
答案 0 :(得分:4)
对于它的价值,这恰好是AGAIN,这次我无法使用黑客,因为我迫切需要指纹。所以,不知何故,奇迹般地,我运行了rake assets:clobber
和heroku 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。