我想我理解你的问题,但我不确定我是否理解选项 2 作为解决方案,这可能表明它不是一个很好的解决方案。如果是我,我只会将正在重用的用户 gravatar 周围的 html 缓存在由用户 ID 键入的顶级缓存键中。IE
<% cache("user_#{user.id}_profile_image") do %>
<img src="blahblahblah or gravatar helper code or whatev">
<% end %>
如果您担心用户上传 gravatar 并随后缓存了默认的 gravatar 图片,我会说您最好的选择是:
1) 在您发送他们上传 gravatar 的用户个人资料区域中,有一个刷新链接,该链接指向一个刷新操作,该操作实际上使用户缓存片段无效。IE
expire_fragment "user_#{user.id}_profile_image"
( http://guides.rubyonrails.org/caching_with_rails.html )
2)您可以不使用默认的 gravatar 重定向来上传图像,而是可以拦截点击,将其发送到您自己的控制器,安排后台任务在 15 分钟左右运行,然后呈现重定向的 javascript 响应他们到实际的 gravatar 页面上传他们的照片。然后,后台工作人员将在稍后运行时清除该片段。这假设他们实际上上传了他们的图像,并且总的来说我会说一个糟糕的想法。
不过老实说,我不知道你为什么一开始就担心缓存 gravatar。它击中了 gravatars 服务器,因此它不会在您的服务器上造成任何负载,自己存储它似乎有点自我挫败到使用 gravatar 的地步。希望您的问题更简单(并且只是:如何在用户上传自己的图像时清除默认缓存的 gravatar 图像),这可以通过 #1 解决),这将允许您使缓存的 gravatar 图像过期并使用您自己的重新缓存它图片,在用户上传他们的图片后。(其中,下次呈现页面时会重新缓存图像,因为您有一些逻辑,例如:
<% cache("user_#{user.id}_profile_image") do %>
<% if user.has_uploaded_image? %>
<%= display_profile_image %>
<% else %>
<%= display_gravatar_image %>
<% end %>
<% end %>