我是一个学习 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
您需要意识到,如果两个用户正在聊天,他们都
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。