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
的管理员身份,然后才真正删除邮件!
我在 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
的管理员身份,然后才真正删除邮件!