Использование переменных сеанса в частичном рендеринге в реальном времени с помощью ActionCable

#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()
 

Мне это не очень нравится, потому что я уже написал сообщение частично. Если у кого-нибудь есть лучший способ, я бы очень хотел его услышать.