2009-09-30 8 views
5

Estoy intentando escribir un método de controlador de Rails que responda para obtener solicitudes hechas tanto "normalmente" (por ejemplo, siguiendo un enlace) como a través de ajax.Cómo responder a solicitudes HTML realizadas a través de AJAX en Rails

Caso normal: El controlador debe responder con HTML totalmente decorado utilizando el diseño.

Caso Ajax: El conroller debe responder con el código HTML generado por la plantilla (sin diseño)

Aquí está el código de jQuery, que he creado para ejecutarse en el lado del cliente para hacer la solicitud GET.

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

¿Cuál es la mejor manera de manejar esto en Rails?

Respuesta

13

En su controlador, seleccione dinámicamente si desea utilizar un diseño basado en request.xhr?.

Por ejemplo:

class SomeController < ApplicationController 
    layout :get_layout 

    protected 

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

En el método de control, sólo tiene que hacer esto:

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

Ooh - No sabía sobre la solicitud.xhr? Espero que no te importe si edito mi respuesta para usar eso. – DanSingerman

+2

En el contexto de la pregunta, 'format.js' no es la mejor opción ya que quiere html. Y para que funcione tu plantilla js debería generar html, lo cual es confuso. – artemave

0

Si está utilizando una nueva versión de los carriles se puede simplemente añadir Js en el camino y inferirá que la solicitud es una llamada de JavaScript

3

Otra forma de hacerlo sería registrar el nuevo formato y specify it explicitly en urls.

poner esto en config/initializers/mime_types.rb:

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

guardar la plantilla en some_controller/some_action.xhml.haml.

Y añadir formato a url: http://mydomain.com/some_controller/some_action.xhtml, o, mejor, utilizar

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

o, mejor aún, ayudantes de ruta (si está lo suficientemente reparador):

some_controller_some_action_imaginary_path(:format => :xhtml) 

mente, que no se requiere el envío explícito respond_to para que esto funcione.

Esta técnica puede ser una exageración si todo lo que quiere es alternar el diseño de la misma plantilla, pero si las versiones normal y ajax son diferentes, entonces definitivamente es un camino por recorrer.


EDIT:
El jQuery 1.5.1 acaba de publicar trae la opción de especificar el tipo MIME en $.ajax():

mimeType: un tipo MIME para anular el tipo mime XHR.

Esto puede ser una alternativa al formato explícito en las URL, aunque todavía no lo he probado.

+0

Esta es una gran solución discreta. Sin embargo, en lugar de modificar la URL, me gusta simplemente usar: 'responder_a: xhtml si request.xhr?' en el controlador. –

Cuestiones relacionadas