使用ActionCable实时渲染部分中的会话变量

时间:2016-10-13 19:02:28

标签: javascript ruby-on-rails 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。因此,即使来自其他用户的消息也使用当前用户类进行呈现。有没有办法正确呈现这些消息?

1 个答案:

答案 0 :(得分:0)

我最终从chat.coffee文件在客户端呈现消息,首先从消息表单中获取用户ID

*args

然后

user_id = parseInt($('#message_user_id').val())

我不是很喜欢它,因为我已经将信息写成了部分内容。如果有人有更好的方法,我真的很想听。