2010-03-15 6 views
11

Die meiste Zeit möchte ich nicht ein Layout rendern, wenn die Anfrage von AJAX kommt. Zu diesem Zweck habe ich render :layout => !request.xhr? häufig in meinen Controller-Aktionen geschrieben.Rendern Sie nie ein Layout als Antwort auf xhrs

Wie kann ich das Standard machen? Das heißt, würde ich in der Lage sein mag

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

und die Funktionalität sein

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

(Ich bin ein Layout in den seltenen Fällen, in denen ich will Angabe einer manuell schreiben müssen fein verwenden .)

+0

Können AJAX-Aufrufe nicht unterschiedliche URLs verwenden? –

Antwort

11

Wie wäre es damit?

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

und funktioniert auch in Rails 3! – gertas

1

Ein normaler after_filter funktioniert nicht, weil wir das Rendering modifizieren wollen.

Wie wäre es mit Hijacking Rendern?

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 

Legen Sie das Layout fest, wenn Sie render aufrufen, um es zu überschreiben. Ein bisschen hässlich, aber sollte funktionieren.

+0

Das wird nicht funktionieren - es ruft sofort 'render' auf (bevor mein Controller die Möglichkeit hat, die Umgebung für meine Ansicht einzurichten) –

+0

Natürlich funktionieren die Filter hier nicht ... mein Fehler! Läuft die aktualisierte Lösung? – anshul

4

Um es den Standard zu nie machen ein Layout für jede XHR Anfrage zu machen, können Sie dies tun:

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

Wenn die Anforderung eine XHR-Anforderung ist, es macht die angeforderte Ansicht ohne Layout Andernfalls wird das Standardlayoutverhalten verwendet, bei dem das Layout durch Vererbung nachgeschlagen wird.

Dies ist anders als controller.request.xhr? ? false : 'application' sagen, denn das wird immer das application Layout für eine nicht-XHR Anfrage, macht den durch Vererbung auf den Nachschlag effektiv deaktiviert.

Siehe auch die ActionView documentation für die nil Argument und Layout Vererbung.

Verwandte Themen