2010-03-15 9 views
11

La mayoría de las veces no deseo renderizar un diseño cuando la solicitud proviene de AJAX. Con este fin he estado escribiendo render :layout => !request.xhr? con frecuencia en mis acciones de controlador.Nunca renderice un diseño en respuesta a xhrs

¿Cómo puedo hacer esto por defecto? Es decir, me gustaría ser capaz de escribir

def new 
    Post.find(params[:id]) 
end 

y tienen la funcionalidad sea

def show 
    Post.find(params[:id]) 
    render :layout => !request.xhr? 
end 

(estoy bien especificar manualmente una disposición en los raros casos en los que yo quiero usar uno .)

+0

¿No es posible simplemente que las llamadas AJAX usen URL diferentes? –

Respuesta

11

¿Qué tal esto?

class UsersController < ApplicationController 
    layout proc {|controller| controller.request.xhr? ? false: "application" } 
end 
+1

¡y también funciona en Rails 3! – gertas

1

Un after_filter normal no funcionará porque queremos modificar el procesamiento.

¿Qué tal secuestro render?

class ApplicationController < ActionController::Base 

    private 
    def render(options = nil, extra_options = {}, &block) 
    options = {:layout => !request.xhr?}.merge(options) unless options.nil? 
    super(options, extra_options)  
    end 
end 

Definir la presentación cuando se llama a prestar a anularlo. Un poco feo, pero debería funcionar.

+0

Esto no funcionará, simplemente llama a 'render' inmediatamente (antes de que mi controlador tenga la oportunidad de configurar el entorno para mi vista) –

+0

Por supuesto, los filtros no funcionarán aquí ... ¡es malo! ¿La solución actualizada funciona? – anshul

4

Con el fin de hacer que el valor predeterminado a Nunca hacer un diseño para cualquier solicitud XHR, usted puede hacer esto:

class ApplicationController < ActionController::Base 
    layout proc { false if request.xhr? } 
end 

Cuando la solicitud es una solicitud XHR, que hace que la solicitaron ver sin un diseño. De lo contrario, usa el comportamiento de diseño predeterminado, que busca el diseño por herencia.

Esto es diferente a decir controller.request.xhr? ? false : 'application', ya que eso siempre hacer que el diseño application para una solicitud no XHR, que efectivamente desactiva la búsqueda por herencia.

Consulte también ActionView documentation para el argumento nil y la herencia de diseño.

Cuestiones relacionadas