2011-10-10 56 views
3

我有一個名爲index的rails動作,它爲我的頁面和佈局呈現內容。當我使用瀏覽器進行/ index操作時,它可以像預期的那樣工作。我想通過使用Ajax調用它能夠也呈現這個動作,我使用這樣做如下:從Ajax調用時不要呈現佈局

<%= link_to "Back", orders_path, :id => 'back_btn', :remote => true %> 
<%= javascript_tag do %> 
    jQuery("#back_btn").bind("ajax:complete", function(et, e){ 
    jQuery("#mybox").html(e.responseText); 
    }); 
<% end %> 

當動作被稱爲這樣,我想它來呈現,並通過索引操作回,不包括佈局。我怎樣才能做到這一點?

回答

3

矯枉過正,你應該能夠到format.js操作添加到您的控制器動作像這樣:

respond_to do |format| 
    format.js 
    format.html 
    format.json { render json: @foos } 

理想情況下,你想創造條件,建立頁面的內容index.js.erb的文件:

$('#foos_list').update("<%= escape_javascript(render(@foos)) %>"); 

如果你要更新一個div的內容,基本上更新整個p年齡在佈局內,那麼你會想要改變它一點。裏面的format.js的,你可以這樣做:

format.js { render 'foos/index', :layout => false } 

但是,如果你試圖去與一個支持Ajax的前端,我可以推薦一個框架,這樣做的,像Spine?它會幫助你建立你的網站很長的路要走。

此外,使用這樣的框架將迫使你根據@ Zepplock的第二個建議分離你的應用程序。

0

您需要一種讓服務器知道請求類型有所不同的方法。它可以通過幾種不同的方式完成:

  • 將一個鍵值附加到URL(例如layout = off)並更改控制器邏輯以呈現沒有視圖的數據。這是一種黑客。
  • 使您的控制器通過XML或JSON返回數據(控制器會知道正在請求什麼內容類型),然後對其進行格式化並顯示在瀏覽器中。這是更優選的方式,因爲您在內容類型之間有明確的分離,並且更適合MVC體系結構。
  • 創建一個將提供數據的API。這將導致不同的身份驗證邏輯,在客戶端更多的代碼,其他API控制器(或多個)服務器等最有可能爲你的情況
1

您只需檢測,如果該請求是一個XML HTTP請求,然後渲染一個留白的佈局設計,像這樣:

render layout: 'blank' if request.xhr? 

你需要在app/views/layouts/blank.html.erb創建一個空白的佈局是這樣的:

<%= yield %>