#javascript #ruby-on-rails #actioncable
#javascript #ruby-на-рельсах #actioncable
Вопрос:
Я создаю приложение для чата в реальном времени в Rails, и у меня возникают проблемы с различением сообщений, отправляемых каждым пользователем. В моем частичном сообщении я использую сеанс current_user для применения либо .current-user, либо .other-user к каждому сообщению.
_message.html.erb
<% if msg.text.present? %>
<% if msg.user_id == current_user.id %>
<p class="current-user msg"><%= msg.text %></p>
<% else %>
<p class="other-user msg"><%= msg.text %></p>
<% end %>
<% end %>
Новые сообщения передаются из контроллера сообщений
class MessagesController < ApplicationController
...
def create
@chat = Chat.find(params[:chat_id])
@message = @chat.messages.build(message_params)
if @message.save
ActionCable.server.broadcast "chat_channel",
message: render_message(@message)
end
end
...
private
def render_message(msg)
render(partial: 'message', locals: { msg: msg })
end
И добавляется в список сообщений с помощью javascript
chats.coffee
received: (data) ->
$('#messages').append data.message
$('#message_text').val('')
messages_to_bottom()
У меня почти получилось, но все время выглядит как current_user = msg.user_id. Таким образом, даже сообщения от другого пользователя отображаются с помощью класса current-user. Есть ли какой-нибудь способ правильно отобразить эти сообщения?
Ответ №1:
В итоге я отрисовал сообщение на стороне клиента из файла chat.coffee, сначала получив идентификатор пользователя из формы сообщения
user_id = parseInt($('#message_user_id').val())
и затем
received: (data) ->
if user_id == data.user_id
$('#messages').append "<div class='current-user msg'>" data.text "</div>"
else
$('#messages').append "<div class='other-user msg'>" data.text "</div>"
$('#message_text').val('')
messages_to_bottom()
Мне это не очень нравится, потому что я уже написал сообщение частично. Если у кого-нибудь есть лучший способ, я бы очень хотел его услышать.