【问题标题】:Using session variables in a partial rendered in realtime with ActionCable使用 ActionCable 实时渲染部分会话变量
【发布时间】:2016-10-13 19:02:27
【问题描述】:

我正在 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 一直。因此,即使来自其他用户的消息也正在使用当前用户类呈现。有什么方法可以正确呈现这些消息?

【问题讨论】:

    标签: javascript ruby-on-rails actioncable


    【解决方案1】:

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

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

    我不太喜欢它,因为我已经写了部分消息。如果有人有更好的方法,我真的很想听听。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      相关资源
      最近更新 更多