2009-07-22 23 views
3

我正在運行最新的Rails 2-3穩定分支(當前爲2.3.3)。必須調用「render:layout => false」才能在Rails 2.3.3中正確呈現js.erb模板。

我使用jQuery發佈一個AJAX請求我的「創造」的行動,其中我有以下塊:

我創建create.js.erb並測試這個動作,我已經添加以下單行:

alert('hello'); 

請求正確輸入format.js塊,但響應嘗試呈現佈局。這是我的日誌:

Jul 22 20:44:27 [2970] INFO: Rendering template within layouts/application 
Jul 22 20:44:27 [2970] INFO: Rendering contacts/create 

如果我改變我的respond_to塊以下,它的工作原理:

respond_to do |format| 
    format.js { render :layout => false } 
end 

這是預期的行爲,或者這是Rails中的錯誤嗎?我會想到,我渲染JS響應足以將佈局設置爲false。

回答

1

我對Ajax on Rails書籍的記憶是,如果不是在早期版本的rails中不一定預期的行爲,那麼這就是標準。

下面的故障單顯示後面記錄了幾個版本的錯誤,以及一種將行爲定義爲默認值的方法。

http://dev.rubyonrails.org/ticket/3229

可悲的是什麼樣的後來變化是使這種過時未在最後的評論解釋說明。

0

生成Ajax POST請求的JQuery函數應該返回「false」。檢查你是否也這樣做。它應該執行如下:

postFormData: function() { 
    $('#form_id').submit(function() { 
    $.post($(this).attr('action'), $(this).serialize(), null, 'script'); 
    return false; 
    }); 
} 

注意最後一行返回false。

+0

是的,我已經返回false了 – Olly 2009-07-27 11:49:50

10

我用這個:

class ApplicationController < ActionController::Base 
    # this is needed to prevent XHR request form using layouts 
    before_filter proc { |controller| (controller.action_has_layout = false) if controller.request.xhr? } 

它是這樣工作的魅力。你必須把這個在線人員放在一個地方,注意更多。

我花了〜1小時寫這行。

2

我發現處理這種情況最好的方法是添加一個像這樣的文件:

應用程序/視圖/佈局/ application.js.erb

<%= yield -%> 

如果不包括產量,你的JS動作都會失敗,因爲應用程序永遠不會呈現視圖。此技術解決了佈局問題,並且還提供了在佈局級別添加通用js代碼的功能,例如閃存處理或觸發jQuery UI onLoad掛鉤。