2010-10-06 13 views
6

Ich habe mein Hauptanwendungslayout, aber dann habe ich einen/account Abschnitt meiner Website, der genau das Layout des Anwendungslayouts hat, außer dass die/accountseiten eine Sidebar in der Inhaltsbereich des Layouts.Erweitern eines bestehenden Layouts in Rails

Anstatt das Anwendungslayout eklatant zu kopieren und ein nahezu redundantes "Konto" -Layout zu erstellen, möchte ich das Anwendungslayout erweitern und die Seitenleiste im Inhaltsbereich hinzufügen.

So habe ich so etwas in meiner Anwendung Layout:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

und ich möchte

<html> 
<body> 

<div id="content"> 

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

    <%= yield %> 

</div> 

</body> 
</html> 

Gibt es eine Möglichkeit, dies ohne Code kopieren zu erreichen?

Antwort

3

Wenn Ihr/Konto Weg auf das Konto Controller gebunden ist, können Sie immer ein vollwertiger Layout mit bedingter Teil ähnliche

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

(ich muss zugeben, dass es nicht das Auge allerdings nicht gefällt)

4

Oft haben Sie die gleiche Situation für andere Teile der Website in diesem Fall ist es sinnvoll, verschachtelte Layouts zu verwenden.

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

+0

Achten Sie darauf, [spätere Versionen] (http://guides.rubyonrails.org/v4.0.12/layouts_and_rendery.html#using-nested-layouts) der gleichen Dokumentation zu überprüfen. Es gab Änderungen in neueren Versionen von Rails und das verlinkte Beispiel funktioniert möglicherweise nicht mehr. –

5

können Sie haben mehr als eine yield in einem Layout, einfach den zusätzlich diejenigen, einen Namen geben:

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

Sie HTML für diese yield unter Verwendung der content_for Methode hinzufügen können

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

Aber Sie müssen das zu jeder Ansicht hinzufügen, die Sie eine Seitenleiste haben möchten. Stattdessen erstellen views/layouts/application_with_sidebar.html.erb

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

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

Further reading

Wenn Sie die Anzahl der yield s auf ein Minimum zu halten, würde es vorziehen, können Sie nisten Ihre Layouts statt.

Ansichten/Layouts/application.html.erb

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

Ansichten/Layouts/application_with_sidebar.html.erb

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

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

Controller/accounts_controller.rb

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

Dann werfe ich Variablen in das globale Layout, die nicht für alle Bereiche der Website gelten.Fühlt sich einfach nicht richtig an. Danke für die Idee. –

+0

@Chad Nested Layouts wie @mark vorgeschlagen sind dann wahrscheinlich die beste Alternative. Alles hängt davon ab, wie oft Sie dieses Markup benötigen. –

Verwandte Themen