在一个动作中呈现多个响应
我的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付费
当你有一个同步连接时这不会工作。 你需要使用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