5

在Rails 3.1开发模式下(使用资产管道时),从资产/图像提供的图像通过响应头“Cache Control:must-revalidate”提供。在Rails 3.1中以开发模式启用图像缓存

这意味着Google Chrome浏览器(看起来只有Chrome浏览器)会尝试多次重新获取图像 - 即使在单页面视图中也是如此。这导致了所有通过JavaScript操作DOM操作的棘手问题。仅举几例:

  • jQuery UI的可拖动有时有戏剧性的鼠标光标
  • 添加或删除CSS类引用了图像闪烁或同时图像的要求调整(这将始终返回偏移304未修改)正在进行中。
  • 附加或替换包含图像的HTML节点将触发更多的图像抓取,这将导致Chrome浏览器等待每个图像的304响应时,其下方的整个节点树会出现口吃。

我完全可以理解为开发服务器做一件合理的事情。我甚至可以理解,即使在单个页面视图内,Chrome拒绝缓存图像也是合理的。

那么,有没有办法改变Rails应用于开发中的图像响应的缓存控制头?

更新:如同一对夫妇所建议的,更有趣的问题是为什么Chrome浏览器尝试在浏览视图中多次重新提取图片,而其他浏览器似乎没有? (为什么这不会导致其他开发者的问题?)

更新x2:我不打算提交这个答案,因为它只是一个解决方案,恰好足以满足我的目的,但我们通过预编译资源,然后丢弃预编译的CSS,可以解决这个问题。 (这需要链轮调试被打开,以虚假的development.rb

rake assets:precompile 
cd public/assets 
find . -name "*.js*" -exec rm -rf {} \; 
find . -name "*.css*" -exec rm -rf {} \; 
+0

我想不出一个Rails配置的这一点,也许做一些挖掘链轮配置而不是? – 2012-01-18 20:36:08

回答

4

我见过的唯一方法来操纵资产的Cache-Control头是通过配置静态资产:

config.serve_static_assets = true 

config.static_cache_control = "public, max-age=3600" 
+1

感谢@MitchKett,但不幸的是,当资产必须由链轮处理时,似乎并没有这样做(也就是说,如果上述文件是公共/资产文件,可能会起作用,但显然如果它们处于应用程序/资产/图像) – 2012-01-18 21:00:39

+0

呃,我给了它一个镜头:)。祝你找到解决方案! – 2012-01-18 21:04:48

1

链轮要么发送缓存标题或强制重新验证(请参阅the source)。

我看不到公开可用的选项来更改此行为。我想你将不得不猴子补丁链轮。

可能更大的兴趣是为什么Chrome会以这种方式行事?

+0

是的,事实上,我只是测试了黑客的链轮源,它的工作*很棒*。编辑的要点:https://gist.github.com/1636038 – 2012-01-18 21:54:56

+0

需要注意的一个问题。缓存后,您必须强制重新加载才能更新任何更改的图像。您可能希望缩短开发时间,并将其仅用于图像。 – 2012-01-18 21:58:19

+0

是的,当然,这不是一个修复,只是验证更改标题可以解决问题。 – 2012-01-18 22:03:13

相关问题