Rails Ajax - 在一个动作中呈现多个响应

时间:2014-01-21 11:33:27

标签: javascript ruby-on-rails ajax

我的rails应用程序中有一个ajax请求,它从我的控制器操作返回一个变量。在控制器动作中,我有一个循环,可能需要一些时间才能通过。

控制器

def myAction
  $j = 1 
  until $j > list_size do
    array <<  {  :foo => $j }   
    $j +=1;
  end  
  @myvariable = array.to_json
end

myAction.js.erb

 var myVariable = JSON.parse("<%= escape_javascript(raw @myvariable) %>");
 for (var k = 0; k < myVariable.length; k++) {
   $("#myDiv").append(myVariable[k].foo);
 }

我希望能够在循环的每个阶段将结果渲染到js.erb partial而不是等待循环完成。这是否可以在不中断循环并在循环结束之前提前结束动作的情况下实现?也许是这样的(伪代码是错误的):

控制器

def myAction
  $j = 1 
  until $j > list_size do
    array <<  {  :foo => $j }   
    render array.to_json
    $j +=1;
  end  
end

myAction.js.erb

 var myVariable = JSON.parse("<%= escape_javascript(raw @myvariable) %>");
 $("#myDiv").append(myVariable.foo);

2 个答案:

答案 0 :(得分:3)

render stream: true将懒惰加载查询并允许它们在呈现资源和布局后运行。 Streaming仅适用于模板而不适用于任何其他形式(例如json或xml)。

所以,你运气不好&amp;您必须使用Rail 4&amp; S中可用的ActionController::Live。以上。 Live是ActionController类中包含的特殊模块。它使Rails能够显式打开和关闭流。这是伪代码适应更像红宝石的&amp;避免全局变量:

class MyController < ActionController::Base
  include ActionController::Live
  def action
    (1..list_size).each do |list_item|
      response.stream.write("{  "foo": #{list_item} }")
    end
  ensure
     response.stream.close
  end  
end

以上代码将从1循环到list_size并立即输出每个list_item

要使用此功能,您应该使用Server-Sent Events。通常,网页必须询问是否有可用的更新。使用服务器发送的事件,更新会自动生成。

请使用以下资源了解更多aboue Streaming,SSE&amp;活动来源:

答案 1 :(得分:0)

当您具有同步连接时,这不起作用。您需要使用websockets来处理此问题。 Websockets是套接字的javascript实现,它为您提供与客户端建立双向连接的机会。因此,当有数据时,您可以使客户端获取部分数据,依此类推。

有一种称为websocket-rails的红宝石宝石,它在轨道中实现了腹板。你可以在这里找到它:

https://github.com/websocket-rails/websocket-rails

这就是我站在哪里的方式...