2013-09-21 174 views
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爲false。目前,上面的設置只能渲染一次而已。

如何從控制器多次重新呈現頁面?有沒有更好的方式去做我想要完成的事情?

回答

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

+0

但我想呈現輸出的生活,因爲它來。 – Snowman

+0

請參閱我的編輯。 –