2010-11-21 10 views
1

Ich versuche herauszufinden, wie das Layout von einem benutzerdefinierten Responder festgelegt wird. Ich möchte die request.xhr verwenden? um das Layout für das Rendern auf 'Ajax' zu setzen. Weiß jemand, wie man das macht? Ich bin mit Rails 3 und ich habe ein Responder wie folgt aus:Layout von Responder setzen?

module AjaxLayoutResponder 
    def to_html 
    if request.xhr? 
     # do something here to change layout... 
    end 
    super 
    end 
end 

Es scheint mir wie ein Responder der beste Weg ist, diese ‚Ajax‘ Layout Umschaltung zu erreichen.

Antwort

1

Ich stimme nicht zu, dass ein Responder der richtige Weg ist. Hier ist eine einfache Lösung, die ich in den meisten meiner Projekte verwenden (aber ich setze einfach nur den Ajax-Layout nil):

In application_controller.rb

layout :set_layout 

def set_layout 
    request.xhr? 'ajax' : 'application' 
end 
+0

, die in der Regel ist das, was ich tue, aber diese spezielle Das Projekt verwendet Layouts, die für verschiedene Controller angepasst sind. Dies würde mein Layout immer "Anwendung" anstelle der angepassten machen. Es scheint mir, dass das Ändern des Layouts basierend darauf, ob die Anfrage ein Ajax ist, tatsächlich zu der Beschreibung eines Responders passt. Warum sollte sich der Controller darum kümmern? Der Antwortgeber passt die Antwort basierend auf dem Anforderungstyp an. Und dies würde die Wiederverwendung von Trockencode fördern. Anstatt für jeden Controller, der ein nicht standardmäßiges Layout hat, ein benutzerdefiniertes 'set_layout' zu erstellen. – demersus

+0

Ah, ich verstehe. Haben Sie Ihre Layouts nach Ihrem Controller benannt? Wenn ja, könnte so etwas funktionieren: request.xhr? 'ajax': params [: Controller] .singularize –

+0

Das scheint logisch. Ich werde es versuchen müssen. Vielen Dank :) – demersus

0

Sie einfach dies tun könnte:

module AjaxLayoutResponder 
    def to_html 
    if request.xhr? 
     options[:layout] = 'ajax' 
    end 
    super 
    end 
end 

weil das, was am Ende der Responder-Ausführung aufgerufen wird, ist:

# from https://github.com/plataformatec/responders/blob/master/lib/action_controller/responder.rb 
def default_render 
    if @default_response 
    @default_response.call(options) 
    else 
    controller.render(options) 
    end 
end 
Verwandte Themen