2

我對現有的Rails 3.2應用程序進行了AJAX化,並且從客戶端發出的某些請求更好地異步完成。爲了促進這一點,並減少渲染時間,我通過警報向用戶提供反饋。我在我的application.html.erb文件的空白的div我添加警報,從某些控制器的動作需要像這樣:在這樣的控制器動作中使用respond_to塊有什麼問題嗎?

def my_async_controller_action 
    @user = User.find(params[:id]) 
    begin 
    #@user.import 
    flash[:notice] = "Your data is being downloaded." 
    rescue Exception => bang 
    flash[:alert] = "There was an error downloading your data: #{bang.message}" 
    end 

    respond_to do |format| 
    format.js { render 'common/flashes' } 
    end 
end 

而且我common/flashes文件只用了jQuery append警報空白格。雖然它工作正常,但我從來沒有見過這樣的警報,只能通過重定向。是否有任何不成文的(或書面的)Rails約定或規則可以通過採用這種方法打破?另外,有沒有辦法改爲做一個respond_with?我看不到我是如何從一條線做兩種不同類型的渲染。

回答

4
  1. 如果js文件正在渲染具有相同的名稱爲您的控制器的作用下,你不需要respond_to塊。

    但是,由於您正在將js文件放在公用文件夾中,要在控制器之間重複使用,您必須明確告訴Rails呈現該文件。這很好。

  2. 如果你的動作只響應js,您可以用括號代替do ... end塊,使之成爲一個內膽:

    respond_to { |format| format.js } 
    

    但是,因爲你必須指定js文件的名稱,這可以得到相當難看,這樣你就可以省略respond_to塊,只是做到以下幾點:

    render 'common/flashes' 
    

    然而,這有不便,如果你的控制器接收html請求,它將在公用文件夾內搜索名爲flashes.html的文件。這很可能會返回Template is missing錯誤。如果你想解決這個問題,你必須以add some constraints的格式。

  3. 但是,如果你的行動也響應html,那麼你應該申報這樣的塊:

    respond_to do |format| 
        format.html 
        format.js { render 'common/flashes' } 
    end 
    

    你不需要format.html,但是當你在看代碼,你馬上可以告訴它對htmljs請求都有迴應。

  4. 使用respond_with塊渲染不同的文件不適用於你的情況,因爲你只是渲染一些JavaScript。 respond_with用於以各種格式(html,json,xml)返回一些資源This article進入更多的細節。

2
respond_to do |format| 
    format.js 
end 

我從控制器一側看不到任何問題。

在.js.erb撕心裂肺的時候就一定要使用escape_javascript

相關問題