1

我有一个这样的控制器动作:

  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 为假。目前,上面的设置只渲染一次,不再渲染。

如何从控制器多次重新渲染页面?有没有更好的方法来做我想要完成的事情?

4

1 回答 1

1

您不需要多次呈现页面。只需将所有输出累积@output到没有剩余,然后渲染页面。您发布的代码几乎可以做到这一点——但首先,您需要将respond_to调用移到循环之外,其次@output =,您需要@output <<. 此外,您需要@output在循环之前初始化为空字符串。

如果您想将可用的输出流式传输到客户端,您也可以这样做。但这是一个不同的问题。如果这是您真正想要的,请参阅:Ruby on Rails 3:通过 Rails 将数据流式传输到客户端

如果要将输出流式传输到客户端,并且需要使用模板为循环的每次迭代生成输出,则可以使用render_to_string. 这是文档:http ://api.rubyonrails.org/classes/AbstractController/Rendering.html#method-i-render_to_string

于 2013-09-21T19:23:46.523 回答