2009-09-30 62 views
5

我正在嘗試編寫一個Rails控制器方法,它將響應獲取「正常」(例如,在鏈接之後)和通過ajax所做的請求。如何響應在Rails中通過AJAX所做的HTML請求

正常情況:控制器應使用佈局進行完全裝飾的HTML響應。

阿賈克斯案例:電腦板應與HTML代碼段響應由模板(無佈局)

這裏是jQuery代碼,我創建了在客戶端運行做GET請求產生的。

jQuery.get("http://mydomain.com/some_controller/some_action", 
      {}, 
      function(data, textstatus) { 
      jQuery("#target").html(data); 
      }, 
      "html"); 

在Rails中處理這個問題的最佳方法是什麼?

回答

13

在您的控制器中動態選擇是否使用基於request.xhr?的佈局。

例如:

class SomeController < ApplicationController 
    layout :get_layout 

    protected 

    def get_layout 
    request.xhr? ? nil : 'normal_layout' 
    end 
end 
9

在你的控制器的方法,根本看:如果你正在使用的軌道的新版本

respond_to do |format| 
     format.js if request.xhr? 
     format.html { redirect_to :action => "index"} 
    end 
+0

哦 - 我不知道要求。XHR?希望你不介意我編輯我的答案來使用它。 – DanSingerman 2009-09-30 16:51:53

+2

在問題的上下文中,'format.js'不是最好的選擇,因爲他希望html不在其中。併爲它的工作你的JS模板應該生成HTML,這是混亂。 – artemave 2011-02-17 10:44:52

0

你可以追加到名爲.js的路徑和它會推斷該請求是一個JavaScript調用

3

這樣做的另一種方法是在URL中註冊新格式和specify it explicitly

config/initializers/mime_types.rb將這個:

Mime::Type.register_alias 'text/html', :xhtml 

保存模板some_controller/some_action.xhml.haml

並添加格式網址: http://mydomain.com/some_controller/some_action.xhtml,或者更好的,使用

url_for(:controller => :some_controller, :action => :some_action, :format => :xhtml) 

,或者甚至更好,路徑傭工(如果你有足夠的寧靜):

some_controller_some_action_imaginary_path(:format => :xhtml) 

記住,沒有明確的respond_to調度需要這個工作。

如果你想要的只是同一模板的切換佈局,這種技術可能是一種矯枉過正,但如果正常和ajax版本不同,那麼它肯定是一種方法。


編輯:
剛剛發佈的jQuery 1.5.1帶來$.ajax()指定MIME類型選項:

mime類型:一個MIME類型覆蓋 XHR的MIME類型。

這可能是一個替代顯式格式的網址,雖然我還沒有嘗試過。

+0

這是一個非常不顯眼的解決方案。但是,我不想修改網址,而是喜歡簡單地使用: 'respond_to:xhtml if request.xhr?' 在控制器中。 – 2013-02-22 05:24:37