turbo_stream 和广播中的 current_user 问题

问题描述 投票:0回答:1

我是一个学习 Rails 的初学者。我正在创建一个聊天应用程序,其中消息模型只有内容、user_id、sender_id 字段。我正在过滤消息以显示两个用户的消息。到目前为止,这里没有什么复杂的。

但问题是,当我广播消息时,广播消息与设计“current_user”有问题。我需要 current_user 在左侧或右侧显示消息。经过谷歌搜索后,我了解到我可以使用当前的属性。但它也不起作用。正在广播的新消息始终被视为发送者。但刷新页面后,一切正常。除非刷新,否则两个用户的页面都显示他们都是发件人。

这是消息部分

<% if Current.user.id == message.sender_id %>
 <div class="flex justify-end">
    <div class="p-3 m-2 rounded-lg max-w-32 bg-sky-300">
      <h3><%= message.body %></h3>
      <h1>
 Current <%= Current.user.id %>
 </h1>
      <h1>
<!--        Devise user <%#= current_user.id %>-->
 </h1>
    </div>
  </div>
<% else %>
 <div class="flex justify-start">
    <div class="p-3 m-2 rounded-lg max-w-32 bg-green-300">
      <h3><%= message.body %></h3>
      <h1>
 Current <%= Current.user.id %>
 </h1>
      <h1>
<!--        Devise user <%#= current_user.id %>-->
 </h1>
    </div>
  </div>
<% end %>

这里的消息是从涡轮流渲染的

<%= turbo_stream_from "messages" %>
<div id="messages" class="h-[32rem] overflow-auto">
 <%= render u/messages %>
</div>

这是广播消息的模型

class Message < ApplicationRecord

  scope :get_messages, ->(user_1, user_2) {
 where("(sender_id = ? AND receiver_id = ?) OR (sender_id = ? AND receiver_id = ?)", user_1, user_2, user_2, user_1)
  }
 after_create_commit {broadcast_append_to "messages"}
end
ruby-on-rails devise turbo
1个回答
0
投票

您需要意识到,如果两个用户正在聊天,他们都

current_user
只是为了不同的请求。您始终根据发件人的请求进行广播,而发件人始终是
current_user

您可以做的就是向每个人广播相同的模板,但为不同的用户添加内联样式:

<!-- _message.html.erb -->

<div class="user_<%= message.sender_id %>">
  <%= message.body %>
</div>

然后在您显示消息的页面上:

<%= turbo_stream_from "messages" %>

<%= render "form", message: Message.new(sender: current_user) %>

<div id="messages" class="min-w-full">
  <%= render @messages %>
</div>

<style type="text/css" media="screen">
  .user_<%= current_user.id %> {
    text-align: right;
  }
</style>

我在这里使用

id
作为示例,但您应该选择一些其他标识符,例如
username
,这样就不会暴露内部 ID。

© www.soinside.com 2019 - 2024. All rights reserved.