定期轮询服务器以获取新的聊天消息

时间:2011-04-19 18:46:54

标签: ruby-on-rails ajax

我使用Rails实现了一个基本的聊天系统。我正在为此使用Message模型,并且我每隔X秒轮询服务器以获取新消息。当用户打开聊天页面时,所有消息都将呈现给视图。我也开始像这样的投票“工作”:

if($("#chat").length > 0) {
    $.periodic({period: 5000, decay: 1.2, max_period: 60000}, function() {
        $.ajax({
            url: document.location.href,
            dataType: 'script'
        });
    });
}

我的控制器看起来像这样:

def index
    @messages = Message.all

    respond_to do |format|
      format.html # index.html.erb
      format.js
    end
end

index.js.erb看起来像这样:

$("#chat li").remove();
<% @messages.each do |msg| %>
 $("#chat").append("<li>" + "<%= escape_javascript msg.content %>" + "</li>");
<% end %>

我现在拥有它的方式是否正常,或者我应该返回JSON并在轮询工作中处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

调用Model.all是一个很大的危险信号。如果定义了数千或数百万条记录怎么办?您将要获取所有

您应该做的是传递一个参数来更新您提取的最后一个ID,然后相应地确定您的消息范围。遵循这种模式可能更合理:

def index
  scope = Message

  if (params[:id])
    # Only fetch those messages created after the last update
    scope = scope.where('id > ?', params[:id])
  end

  # Fetch the 100 most recent messages
  @messages = scope.limit(100).order('created_at DESC').all
end

如果您在客户端跟踪最大ID号,则可以将此参数传递给后续提取。

由于您只提取新记录,因此您应将这些记录附加到列表中,而不是完全替换列表。