在 Rails 中呈现通过 Pusher 传递的对象

Rendering an object passed through Pusher in Rails

我正在尝试实现一个实时聊天应用程序。

我正在使用推送器通知服务器有关按钮单击的信息,然后将消息对象作为 message 传递给订阅者。我需要做的是,在其他用户的聊天屏幕 (show.html.erb) 中动态呈现该消息。这是我的周期:

// MessagesController.rb

    def create
        conversation = Conversation.find(params[:conversation_id])
    message = Message.create(content: params[:content], user_id: params[:user_id])
    conversation.messages << message
        Pusher['test_channel'].trigger('my_event', {
      message: message
    })
    end

我的订阅者是

// show.html.erb    
    // some html code 
       <ul class="chats">
       <%= render @messages %>
       </ul>
    // some html code

    <script>
         // some js code
         var channel = pusher.subscribe('some_channel');

         channel.bind('some_event', function(data) {
             // What to do here?
         });
    </script>

如果您使用的是JQuery,

channel.bind('some_event', function(data) {
    $('.message').text(data.message);
});

看到这个tutorial

这假设您使用的是 jquery。它也未经测试,因此可能有一些 bugs/syntax 错误。

Ajax方法:

JS

channel.bind('some_event', function(data) {
  $.ajax({
    url:'/messages/'+data.message.id,
    success:function(html){ $('.chats').append(html)}
  });
});

路线:

match '/messages/:id' => "messages#show_no_layout"

控制器:

def show_no_layout
  @message = Message.find(params[:id])
  render "show", layout: false
end

查看(show.html.erb):

<%= *whatever you want in here* %>

ICH(read more) 方法:

这当然需要添加一个额外的 js 文件,这就是为什么这不是我的第一个建议。

模板:

<script id = "messageTemplate" type = "text/html">
   {{ message.content }}
   // plus whatever else you want.
</script>

channel.bind('some_event', function(data) {
  messageHtml = ich.messageTemplate(data.message);
  $('.chats').append(messageHtml);
});