【问题标题】: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 %>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多