【问题标题】:Rails Ajax - render multiple responses in one actionRails Ajax - 在一个动作中呈现多个响应
【发布时间】:2014-02-10 23:27:43
【问题描述】:

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

【问题讨论】:

标签: javascript ruby-on-rails ajax


【解决方案1】:

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。

要使用它,您应该使用服务器发送事件。通常,网页必须询问是否有可用的更新。对于服务器发送的事件,更新会自动进行。

请使用以下资源了解有关流式传输、SSE 和事件源的更多信息:

【讨论】:

    【解决方案2】:

    当您有同步连接时,这将不起作用。您需要使用 websockets 来处理这个问题。 Websockets 是 Sockets 的 javascript 实现,它使您有机会与客户端建立双向连接。所以可以让客户端在有数据的时候去取一部分数据等等。

    有一个名为 websocket-rails 的 ruby​​ gem,它在 rails 中实现 websockets。你可以在这里找到它:

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

    这就是从我站的地方去的路......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2011-09-20
      • 2021-08-26
      • 2018-10-31
      • 1970-01-01
      相关资源
      最近更新 更多