我有一个像这样的控制器动作:
def get_build_output
@project = Project.find(params[:project_id])
@build_num = params[:build_num]
has_more = true
while has_more == true
response = jenkins_client.job.get_console_output(@project.name, @build_num, 0, "html")
@output = response["output"]
has_more = response["more"]
respond_to do |format|
format.js
end
end
end
我有一个get_build_output.js.erb
文件:
$("#build_output").append("<%= raw escape_javascript(@output) %>");
我正在尝试不断从远程调用获取输出并将其呈现到视图中,直到has_more为false。目前,上面的设置只渲染一次而不再渲染。
如何从控制器多次重新呈现页面?有没有更好的方法来做我想要完成的事情?
答案 0 :(得分:1)
您不需要多次呈现该页面。只需累积@output
中的所有输出,直到没有剩余,然后渲染页面。您发布的代码几乎会这样做 - 但首先,您需要将respond_to
调用移到循环之外,其次,而不是@output =
,您需要@output <<
。此外,您需要在循环之前将@output
初始化为空字符串。
如果要将输出流式传输到客户端,您也可以这样做。但这是一个不同的问题。如果这是您真正想要的,请参阅:Ruby on Rails 3: Streaming data through Rails to client
如果要将输出流式传输到客户端,并且需要使用模板为循环的每次迭代生成输出,则可以使用render_to_string
将模板呈现为字符串。以下是文档:http://api.rubyonrails.org/classes/AbstractController/Rendering.html#method-i-render_to_string