如何在Rails 3.2中缓存gravatars?

时间:2012-02-24 21:02:26

标签: ruby-on-rails caching gravatar

我在我的学习应用中写了一个gravatar助手。 Users#index动作会列出所有使用其gravatars的用户,即使使用分页也可能需要一段时间。有没有办法在Rails 3.2中缓存gravatars,记住以下几点:

  1. 不使用具有缓存功能的Gravatar插件。
  2. 不缓存用户页面本身;实际上,我只是想要自己缓存图像,而无需再次从gravatar.com抓取它们。

    def gravatar_for(user, options = { size: 50 })  
        gravatar_id  = Digest::MD5::hexdigest(user.email.downcase)
        size = options[:size]
        gravatar_url = "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{size}"
        image_tag(gravatar_url, alt: user.name)
    end
    

3 个答案:

答案 0 :(得分:2)

我的问题是你为什么需要这个?您正在从外部服务器和用户浏览器放置图像,gravatar.com必须缓存它。这就是为什么gravatar存在的原因,因为管理头像没有开发人员的任何工作。如果您需要缓存gravatars,那么为什么你真的需要它呢?

答案 1 :(得分:2)

如果您查看源代码,您会看到SO不执行自己的gravatar缓存。刷新页面几次,您可能会看到gravatars仍然是最后加载的元素。

您可以采取的一些措施来提高绩效:

  • 在正常设置缓存控制的生产模式下运行时,浏览器会为您进行一些图像缓存(可能会看一下那个轨道广播,我认为是第321集)
  • 在img标记中包含图片尺寸,浏览器会在图像可用之前保留适当数量的屏幕空间,重绘次数更少且感觉更加生动
  • 提供自己的占位符,而不是更昂贵的识别等。

答案 2 :(得分:1)

缓存整个用户页面或片段缓存图片网址无论如何都不会产生任何影响,因为图片仍将从Gravatar下载。 Gravatar将他们的Cache-Control标题设置为最长5分钟,并且您无法做到这一点。

一种可能性是将图像保存到您可以控制响应标题的另一个位置。

在开发过程中你可以做的一件小事就是不要在页面上使用硬刷新。在某些浏览器中CMD/CTRL + R或按下刷新按钮会发送带Cache-Control:max-age=0的请求标头,这会导致您重新下载所有图像。您只需再次访问该页面即可进行软刷新(例如:按地址栏中的URL输入),它将不会发送该标题。