2012-02-24 47 views
0

我写了一个gravatar帮手在我的学习应用程序中使用。用户#索引动作列出所有用户使用他们的gravatars,即使分页也需要一段时间。有没有办法在Rails 3.2中缓存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 
    

回答

1

缓存整个用户页面或片段缓存图像URL无论如何不会有所作为,因为图像仍然会从Gravatar下载。 Gravatar将他们的Cache-Control标题设置为5分钟的最大年龄,并且您可以做的其他事情也不多。

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

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

2

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

+0

当我点击用户索引页面时,它看起来真的很难看到一个接一个地按顺序加载gravatars。我认为它会立即缓存它们,因为它们瞬间显示出来。 – Mohamad 2012-02-25 10:30:12

+0

即使你从你自己的服务器那里服务,它也不会更快。另外,一些新的网页浏览器只有在无法节省带宽时才显示图像。 – Hauleth 2012-02-25 10:35:03

2

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

有些事情可以做,以提高性能为:

  • 当在生产模式与正确设置高速缓存控制运行,浏览器会做一些图像的缓存为你(也许观看了railscasts,插曲321我认为)
  • 包括在你的img标签的图像尺寸,浏览器甚至是图像之前将保留的屏幕空间适量是可用的,它确实减少重画,感觉活泼
  • ,而不是即成您自己的占位符更昂贵的identicons等