0

我写了一个 gravatar 助手来在我的学习应用程序中使用。Users#index 操作列出了所有用户及其 gravatar,即使使用分页也可能需要一段时间。有没有办法在 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
    
4

3 回答 3

2

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

于 2012-02-24T21:08:36.957 回答
2

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

您可以采取一些措施来提高性能:

  • 当在缓存控制设置正确的生产模式下运行时,浏览器会为你做一些图像缓存(也许看一下上面的 railscasts,第 321 集我想)
  • 在您的 img 标签中包含图像尺寸,浏览器会在图像可用之前保留适量的屏幕空间,它会减少重绘并感觉更生动
  • 提供您自己的占位符,而不是更昂贵的标识等。
于 2012-07-25T23:24:59.850 回答
1

缓存整个用户页面或缓存图像 url 的片段无论如何都不会产生影响,因为图像仍将从 Gravatar 下载。Gravatar 将他们的Cache-Control标题设置为 5 分钟的最大年龄,您对此无能为力。

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

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

于 2012-02-24T21:15:23.367 回答