2010-11-21 18 views
1

J'essaie de comprendre comment configurer la mise en page à partir d'un répondeur personnalisé. Je veux utiliser le request.xhr? pour définir la disposition du rendu sur 'ajax'. Est-ce que quelqu'un sait comment faire cela? J'utilise Rails 3 et j'ai un répondeur comme ceci:Définir la disposition du répondeur?

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

Il semble à moi comme un répondeur est la meilleure façon d'y parvenir commutation de mise en page « ajax ».

Répondre

1

Je ne suis pas d'accord qu'un répondeur est la voie à suivre. Voici une solution facile que je l'utilise dans la plupart de mes projets (mais je viens de mettre en la disposition ajax à zéro):

Dans application_controller.rb

layout :set_layout 

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

qui est généralement ce que je fais, mais ce particulier Le projet utilise des dispositions personnalisées pour différents contrôleurs. Cela rendrait toujours ma mise en page "application" au lieu de celle personnalisée. Il me semble que modifier la disposition, en fonction de si la requête est ajax, correspond effectivement à la description d'un répondeur. Pourquoi le contrôleur devrait-il s'en préoccuper? Le répondeur personnalise la réponse en fonction du type de requête. Et cela favoriserait la réutilisation du code sec. Au lieu d'avoir à faire un 'set_layout' personnalisé pour chaque contrôleur qui a une disposition non standard. – demersus

+0

Ah, je vois. Avez-vous vos mises en page nommées d'après votre contrôleur? Si oui, quelque chose comme ça peut fonctionner: request.xhr? 'ajax': params [: controller] .singularize –

+0

Cela semble logique. Je vais devoir essayer. Merci :) – demersus

0

vous pouvez simplement faire ceci:

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

parce que ce qu'on appelle à la fin de l'exécution du répondeur est:

# 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