3

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

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

好吧,每当用户 A 创建帖子时,它都会使用适当的编辑/删除链接进行缓存,因为她应该根据她的权限让这些链接可见。但是,当用户 B 查看该集合时,他会看到用户 A 的缓存帖子,以及他不应该看到的编辑/删除链接。当然,CanCan 阻止了这些编辑/删除操作的发生,但链接仍然存在。

是否有根据 current_user.id 创建单个缓存并防止拥有(几乎)相同缓存内容的版本?

4

1 回答 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 %>

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

于 2015-03-08T17:28:09.713 回答