2010-06-11 4 views
145

J'utilise une mise en page différente pour certaines actions (principalement pour la nouvelle action dans la plupart des contrôleurs). Je me demande quelle serait la meilleure façon de spécifier la mise en page? (J'utilise 3 ou plusieurs mises en page dans le même contrôleur)Rails mises en page par action?

Je n'aime pas utiliser

rendre: layout => 'name'

J'aimais bien faire

mise en page

'name',: seulement => [: nouveau]

Mais Je ne peux pas utiliser cela pour spécifier 2 ou plusieurs mises en page différentes.

Par exemple:

Quand j'appelle la mise en page 2 fois dans le même contrôleur, avec des noms différents de mise en page et différentes options seulement, le premier est ignorée - ces actions ne présentent pas dans la mise en page I spécifié.

Note: J'utilise Rails 2.

+1

rails documentation Guides: http://guides.rubyonrails.org/layouts_and_rendering.html#finding-layouts – Kevin

+1

Bon point. La documentation pour Rails 2: http://guides.rubyonrails.org/v2.3.11/layouts_and_rendering.html#finding-layouts – Kevin

+2

(Aussi, j'ai posté le guide pour aider les futurs lecteurs, je n'ai aucun doute que vous avez résolu votre problème. il y a longtemps ;-) – Kevin

Répondre

263

Vous pouvez utiliser une méthode pour définir la mise en page.

class MyController < ApplicationController 
    layout :resolve_layout 

    # ... 

    private 

    def resolve_layout 
    case action_name 
    when "new", "create" 
     "some_layout" 
    when "index" 
     "other_layout" 
    else 
     "application" 
    end 
    end 
end 
+21

Cool, merci. Et au cas où quelqu'un voudrait faire des choses plus simples avec un interligne, ce qui suit est possible. C'est facile à lire et à placer en haut du contrôleur. --- 'layout Proc.new {['index', 'nouveau', 'créer']. Include? (Nom_action)? 'some_layout': 'other_layout'} ' – holli

+1

Est-ce que cela aurait un grand effet sur les performances de l'application si différentes mises en page utilisent respectivement plusieurs fichiers css & js différents? – Noz

+0

Ce n'est pas un thread sécurisé. –

43

Vous pouvez spécifier la mise en page pour une action individuelle à l'aide respond_to:

def foo 
    @model = Bar.first 
    respond_to do |format| 
     format.html {render :layout => 'application'} 
    end 
    end 
+0

Pour moi, c'est la réponse la plus flexible. Sécher les choses en appliquant 'layout '[...]" à la classe de contrôleur ne permet qu'une seule instruction de manière efficace. Si vous avez plus de deux mises en page à traiter (par exemple, admin, generic_app, tailored_app), vous rencontrerez les erreurs "Rendu et/ou redirection ont été appelés plusieurs fois dans cette action"; et vous n'avez pas d'autre choix que d'utiliser cette suggestion. – Jerome

+1

Cette réponse est la meilleure, c'est simple et soigné par opposition à l'utilisation de méthodes avec des instructions switch ou if à l'intérieur. – kev

+0

aussi il peut spécifier le fichier erb et la mise en page à la fois: 'format.html {render 'custom_index', mise en page: 'application'}' de la même manière. –

167
class ProductsController < ApplicationController 
    layout "admin", only: [:new, :edit] 
end 

ou

class ProductsController < ApplicationController 
    layout "application", only: [:index] 
end 
+9

Voilà la bonne réponse! –

+2

Eh bien, le problème est que vous ne pouvez pas accéder à des objets tels que current_user pour déterminer conditionnellement la disposition –

+0

Ceci est la bonne réponse, pas au dessus de – Jacky

8

Vous pouvez également spécifier la mise en page d'action avec render:

def foo 
    render layout: "application" 
end 
7

Différentes façons de spécifier la mise en page sous commande:

  1. Dans le code suivant, la mise en page application_1 est appelée sous l'index et l'action d'affichage du contrôleur d'utilisateurs et la disposition de l'application (mise en page par défaut) est appelée pour d'autres actions.

    class UsersController < ApplicationController 
        layout "application_1", only: [:index, :show] 
    end 
    
  2. Dans le code suivant, la mise en page application_1 est appelé à toute action du contrôleur des utilisateurs.

    class UsersController < ApplicationController 
        layout "application_1" 
    end 
    
  3. Dans le code suivant, application_1 mise en page est appelé à une action de test des utilisateurs contrôleurs uniquement et pour toutes les autres applications de mise en page d'action (par défaut) est appelée.

    class UsersController < ApplicationController 
         def test 
         render layout: "application_1" 
         end 
        end 
    
Questions connexes