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

3
我有一个使用俄罗斯套娃缓存的视图,其中整个项目集被缓存,集合中的每个项目都在该缓存中单独缓存。
然而,集合中的每个项目都应该显示基于当前用户通过CanCan授予的权限的编辑/删除链接。因此,仅当User A看到自己的帖子时,才会看到编辑/删除链接,而不是在User B的帖子旁边看到它们。
好吧,每当User A创建帖子时,就会将其缓存,并带有适当的编辑/删除链接,因为她应该根据自己的权限可以看到它们。但是当User B查看集合时,他会获得User A的缓存帖子,以及他不应该看到的编辑/删除链接。尽管CanCan防止这些编辑/删除操作发生,但链接仍然存在。
有没有办法根据current_user.id创建个人化缓存并避免拥有大量(几乎)相同的缓存内容版本?
1个回答

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 %>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接