【问题标题】:Russian doll caching and permission-based links in view fragment视图片段中的俄罗斯娃娃缓存和基于权限的链接
【发布时间】:2014-12-27 02:37:20
【问题描述】:
我有一个使用俄罗斯娃娃缓存的视图,其中缓存了整个项目集合,并且集合中的每个项目都单独缓存在该缓存中。
但是,集合中的每个项目都应根据当前用户通过 CanCan 授予的权限显示编辑/删除链接。因此,用户 A 只会在她自己的帖子旁边看到编辑/删除链接,而不会在用户 B 的帖子旁边看到。
好吧,每当用户 A 创建帖子时,都会缓存相应的编辑/删除链接,因为根据她的权限,她应该可以看到这些链接。但是,当用户 B 查看该集合时,他看到了用户 A 的缓存帖子,以及他不应该看到的编辑/删除链接。当然,CanCan 阻止了这些编辑/删除操作的发生,但链接仍然存在。
是否有根据 current_user.id 创建单独的缓存并防止拥有(几乎)相同缓存内容的版本?
【问题讨论】:
标签:
ruby-on-rails
caching
ruby-on-rails-4
fragment-caching
russian-doll-caching
【解决方案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 %>
请注意,缓存键生成可能应该被提取到单独的类/帮助器方法中。