俄罗斯娃娃缓存和视图片段中基于权限的链接

时间:2014-10-30 21:13:29

标签: ruby-on-rails caching ruby-on-rails-4 fragment-caching russian-doll-caching

我有一个使用俄罗斯玩偶缓存的视图,其中整个项目集合被缓存,集合中的每个项目都在该缓存中单独缓存。

但是,集合中的每个项目都应根据CanCan授予的当前用户权限显示编辑/删除链接。因此,用户A只会在她自己的帖子旁边看到编辑/删除链接,但不会在用户B的帖子旁边看到。

嗯,每当用户A创建一个帖子时,它都会被相应的编辑/删除链接缓存,因为她应该根据她的权限显示它们。但是当用户B查看该集合时,他会为用户A的缓存帖子以及他不应该看到的编辑/删除链接提供服务。当然,CanCan可以防止这些编辑/删除操作发生,但链接仍然存在。

是否存在基于current_user.id创建单个缓存并防止出现(几乎)相同缓存内容版本的大量内容?

1 个答案:

答案 0 :(得分:1)

  

是否存在基于current_user.id创建单个缓存并防止出现(几乎)相同缓存内容版本的大量内容?

您可以包含用户的权限,而不是将用户的ID包含在缓存键中。这仍然会有内容的重复副本,但会根据您的权限模型进行扩展,而不是根据用户数量进行扩展。所以不是典型的:

<% cache("posts/all-#{Post.maximum(:updated_at).try(:to_i)}") do %>
...
<% end %>

您可以创建一个缓存键(假设current_user返回经过身份验证的用户)并且您只关心编辑与阅读:

<% cache("posts/all-#{Post.maximum(:updated_at).try(:to_i)}-#{current_user.can?(:edit, Post) ? :edit : :read}") do %>
...
<% end %>

请注意,缓存密钥生成应该可以提取到单独的类/辅助方法。