Rails

2009-09-30 11 views
5

içinde AJAX yoluyla yapılan HTML istekleri nasıl yanıtlanırım "normal" (örneğin, bir bağlantıyı izleyerek) ve ajax aracılığıyla yapılan istekleri yanıtlamak için yanıt verecek bir Rails denetleyici yöntemi yazmaya çalışıyorum.Rails

Normal Durum: Denetleyici, düzeni kullanarak tam olarak dekore edilmiş HTML ile yanıt vermelidir.

Ajax Olgu: HTML ile yanıt vermelidir conroller şablonunda (hayır düzeni)

İşte olsun isteğini yapmak istemci tarafında çalıştırmak için oluşturduk, jQuery kodu tarafından üretilen snippet'iniz.

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

Bunu Rails'de işlemenin en iyi yolu nedir?

cevap

13

Denetleyicinizde request.xhr? tabanlı bir düzen kullanılıp kullanılmayacağını dinamik olarak seçin.

Denetleyiciniz yönteminde
class SomeController < ApplicationController 
    layout :get_layout 

    protected 

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

, sadece bu do: Örneğin

sadece yoluna .js ekleyebilirsiniz Eğer raylar yeni bir sürümünü kullanıyorsanız

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

Ooh - İstek hakkında bilgim yoktu.xhr? Bunu kullanmak için cevabımı düzenlerseniz umursamıyorum umarım. o bunun dışında html istediği beri söz bağlamında – DanSingerman

+2

, 'format.js' en iyi seçenek değildir. Ve onun çalışması için js şablonunuz, kafa karıştırıcı olan html üretmelidir. – artemave

0

ve Bu isteğin bir JavaScript çağrısı olduğunu bildirecektir

3

Bunu yapmanın bir başka yolu, URL'lerde yeni biçim ve specify it explicitly kayıt olmaktır.

config/initializers/mime_types.rb koy:

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

some_controller/some_action.xhml.haml şablonunuzu kaydedin.

Ve url formatını ekleyin: O,

some_controller_some_action_imaginary_path(:format => :xhtml) 

Zihin: (eğer yeterince dinlendirici varsa), daha da iyisi, yol yardımcıları

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

kullanın veya, http://mydomain.com/some_controller/some_action.xhtml veya daha iyi Bunun çalışması için açık bir respond_to gönderimine gerek yoktur.

İstediğiniz tek şey aynı şablon için mizanpajı değiştirmekse, bu teknik aşırı bir sıkıntı olabilir, ancak normal ve ajax sürümleri farklıysa, kesinlikle gitmek için bir yoldur.


DÜZENLEME:
sadece serbest jQuery 1.5.1 $.ajax() yılında MIME türü belirtme seçeneği getiriyor:

mimeType: Bir mim tipi XHR MIME türü geçersiz kılmak için.

Bu, henüz denemediğim halde, URL'lerde açık biçime bir alternatif olabilir.

+0

Bu harika göze çarpmayan bir çözümdür. Ancak, bunun yerine URL'yi değiştirme, ben sadece kullanmak ister: 'respond_to: xhtml eğer request.xhr' denetleyicisi ?. –