操作电缆:根据当前用户广播不同的模板内容

时间:2017-07-03 19:21:21

标签: ruby-on-rails ruby-on-rails-5 erb actioncable

我在部分中有一条删除链接,用于通过ActionCable在聊天中呈现的消息。如果current_user是否为管理员,我是否使用以下代码进行检查,以及用户是否可以看到该链接:

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

但这恰好是一个问题。 当一个不是admin的用户提交邮件时,它会被呈现为&#39;而不是管理员&#39;对于聊天中的每个用户,管理员只能在刷新后才能看到该链接。 反之亦然,如果管理员提交消息,则每个人都可以看到该链接。

有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:1)

由于您要呈现单个模板并将其广播给每个人,因此可以预期此行为。基本问题是,在将模板呈现为广播时,current_user是发布消息的用户,通过操作电缆接收更新的用户。

您可以通过以下方式完全在客户端解决问题:

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

然后添加此CSS规则:

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

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

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

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

重要提示:确保在实际删除邮件之前验证current_user操作中destroy的管理员!