Action Cable:根据当前用户播放不同的模板内容

Action Cable: broadcast different template content depending on the current user

我在 ActionCable 在聊天中呈现的消息的部分内容中删除了 link。我正在使用以下代码检查 current_user 是否为管理员以及用户是否可以看到 link:

<% if current_user.admin? %>
  <%= link_to '[x]', msg, method: :delete, remote: true, class: "del-link" %>
<% end %>

但这恰好有一个问题。 当不是 admin 的用户提交消息时,聊天中的每个用户都会将其呈现为 'not admin',管理员只能在刷新后才能看到 link。 反之亦然,如果管理员提交消息,每个人都可以看到 link.

有办法解决这个问题吗?

由于您正在渲染单个模板并将其广播给所有人,因此这种行为是可以预料的。基本问题是,在呈现要广播的模板时,current_user 是用户发布消息, 而不是 用户通过 Action Cable 接收更新。

您可以通过执行以下操作完全在客户端解决问题:

<%= link_to '[x]', msg, method: :delete, remote: true, class: "del-link admin-only" %>

然后添加此 CSS 规则:

body:not(.with-admin) .admin-only {
  display: none;
}

如果当前用户是管理员,则在 <body> 上设置 with-admin class:

<body class="<%= "with-admin" if current_user.admin? %>">
  <!-- ... -->
</body>

这样 admin-only 元素的可见性由当前页面最初是否以管理员身份加载来控制,并且 Action Cable 广播的模板可以为所有人提供相同的内容。

重要提示:确保在 destroy 操作中验证 current_user 的管理员身份,然后才真正删除邮件!