用 CSS 控制页面内容对部分用户可见

Rei
·

问题

写 Web 应用的时候,经常需要写这样的 HTML 片段:

<div class="post">
  ...
  <% if current_user == post.author || current_user.admin? %>
    <a href="/posts/1/edit">edit</a>
  <% end %>
</div>

其中 edit 这个链接只显示给作者或者管理员。但如果加入用户相关的逻辑,这个片段就无法缓存了。

除了写客户端 js 修改内容外,有没有简单的方法控制内容对部分内容可见呢?

解决方法

我在分析 hey.com 页面的时候发现一种用 CSS 控制内容可见性的方法,分享如下。

修改 HTML 片段为:

<div class="post">
  ...
  <div class="hidden visible-to-user__<%= post.user_id %> visible-to-admin">
    <a href="/posts/1/edit">edit</a>
  </div>
</div>

然后在页面布局尾部加入以下内容:

<style>
  .hidden {
    display: none;
  }

<% if current_user %>
  .visible-to-user__<%= current_user.id %> {
    display: block !important;
  }
<% end %>

<% if current_user&.admin? %>
  .visible-to-admin {
    display: block !important;
  }
<% end %>
</style>

这样只用 CSS 就可以控制这部分内容对特定用户可见,并且可以将 HTML 片段缓存。

注意事项

这个方法只适用于不敏感的数据,例如上面要隐藏的内容是可以根据 ID 推测出来的。

要隐藏敏感数据,例如涉及访问权限、付费内容等,还是要用后段逻辑做判断,不能用这个方法。

3
评论
登录后评论

我感觉这样写CSS太多, 可以用 Rails 6.1 class_names helpers 方法

<%= tag.div class: ["hidden", "display-visible": current_user == post.author || current_user.admin?] do %>
  <a href="/posts/1/edit">edit</a>
<% end %>
社区准则 博客 联系 社区 状态
主题