在一个动作中呈现多个响应

我的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部分,而不是等待循环结束。 这可能没有打破循环,并在循环结束之前过早地结束动作? 也许这样(伪代码是错误的):

调节器

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

render stream: true将延迟加载查询并允许它们在资产和布局渲染后运行。 流只能用于模板,不能用于任何其他形式(如json或xml)。

所以,你运气不好,你将不得不使用Rail 4及以上版本的ActionController::Live 。 Live是ActionController类中包含的一个特殊模块。 它使Rails能够明确地打开和关闭流。 这里是伪代码适应更像ruby和避免全局变量:

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。 通常,网页必须询问是否有更新可用。 使用服务器发送的事件时,更新会自动进行。

请使用以下资源了解更多信息流,SSE和事件来源:

  • API Docs - ActionController :: Live

  • Railscast付费

  • 它是活着的吗?
  • 使用Rails进行流式处理4
  • 服务器发送的事件 - 维基百科
  • 在客户端@ html5rocks上查看

  • 当你有一个同步连接时这不会工作。 你需要使用websocket来处理这个问题。 Websockets是一个Sockets的JavaScript实现,它可以让你有机会与客户端建立双向连接。 因此,当有数据等时,您可以使客户端获取部分数据。

    有一种叫做websocket-rails的ruby gem,它在rails中实现websocket。 你可以在这里找到它:

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

    多数民众赞成从我站在哪里去...

    链接地址: http://www.djcxy.com/p/18721.html

    上一篇: render multiple responses in one action

    下一篇: Knockout Observable Array with Sorting and Foreach Data