2010-10-06 6 views
6

J'ai ma disposition d'application principale, mais j'ai une section/compte de mon site qui a exactement la même disposition que la mise en page de l'application, sauf que les pages/compte ont une barre latérale supplémentaire zone de contenu de la mise en page. Plutôt que de copier de façon flagrante la mise en page de l'application et de créer une mise en page «compte» presque redondante, j'aimerais étendre la mise en page de l'application en ajoutant la barre latérale dans la zone de contenu.Extension d'une disposition existante dans Rails

J'ai quelque chose comme ça dans ma mise en page de l'application:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

et je veux

<html> 
<body> 

<div id="content"> 

    <div id="sidebar"></div> 

    <%= yield %> 

</div> 

</body> 
</html> 

Est-il possible d'y arriver sans le code copie?

Répondre

3

Si votre/itinéraire de compte est lié au contrôleur de compte, vous pouvez toujours avoir une mise en page fullfeatured avec une partie conditionnelle comme celui-ci

render :template => "/shared/sidebar" if controller.controller_name == "account" 

(je dois admettre que cela ne plaît pas l'œil bien)

4

Souvent, vous aurez la même situation pour d'autres parties du site, auquel cas il peut être judicieux d'utiliser des mises en page imbriquées.

http://guides.rubyonrails.org/v2.3.8/layouts_and_rendering.html#using-nested-layouts

+0

Assurez-vous de vérifier [les versions ultérieures] (http://guides.rubyonrails.org/v4.0.12/layouts_and_rendering.html#using-nested-layouts) de la même documentation. Il y avait des changements dans les nouvelles versions de Rails et l'exemple lié peut ne plus fonctionner. –

5

Vous pouvez avoir plus d'un yield dans une mise en page, donne simplement les autres un nom:

<html> 
<body> 
    <div id="content"> 
    <%= yield :sidebar %> 
    <%= yield %> 
    </div> 
</body> 
</html> 

Vous pouvez ajouter du code HTML pour cette yield en utilisant la méthode content_for

<% content_for :sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

Mais vous devrez ajouter cela à chaque vue que vous voulez avoir une barre latérale. Au lieu de cela, créer views/layouts/application_with_sidebar.html.erb

<% content_for :sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

<%= render :file => 'layouts/application' %> 

Further reading

Si vous préférez garder le nombre de yield s au minimum, vous pouvez imbriquer vos mises en page au lieu.

vues/mises en page/application.html.erb

<html> 
<body> 
    <div id="content"> 
    <%= yield(:with_sidebar) or yield %> 
    </div> 
</body> 
</html> 

vues/mises en page/application_with_sidebar.html.erb

<% content_for :with_sidebar do -%> 
    <div id="sidebar"></div> 
<% end -%> 

<%= render :file => 'layouts/application' %> 

contrôleurs/accounts_controller.rb

class AccountsController < ApplicationController 
    layout 'application_with_sidebar' 
    ... 
end 
+0

Ensuite, je jette des variables dans la disposition globale principale qui ne s'applique pas à toutes les sections du site.Juste ne me sens pas bien. Merci pour l'idée. –

+0

@Chad Layouts imbriqués comme @mark suggéré sont probablement la meilleure alternative, alors. Tout dépend de combien de fois vous avez besoin de ce balisage pour apparaître. –

Questions connexes