2010-10-06 18 views
6

Mam swój główny układ aplikacji, ale mam sekcję/konta w mojej witrynie, która ma dokładnie taki sam układ, jak układ aplikacji, z wyjątkiem stron/konta mają dodany pasek boczny w zawartość obszaru układu.Rozszerzanie istniejącego układu w Railsach

Zamiast rażąco skopiuj układ aplikacji i utwórz prawie nadmiarowy układ "konta", chciałbym rozszerzyć układ aplikacji, dodając pasek boczny w obszarze zawartości.

Więc mam coś takiego w moim układzie aplikacji:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

i chcę

<html> 
<body> 

<div id="content"> 

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

    <%= yield %> 

</div> 

</body> 
</html> 

Czy istnieje sposób, aby osiągnąć ten cel bez kopiowania kodu?

Odpowiedz

3

Jeśli/konto trasa jest zobowiązany do kontrolera obrotów, można zawsze mieć fullfeatured układ z części warunkowej jak ten

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

(muszę przyznać, że nie cieszyć oko choć)

4

Często będziesz mieć tę samą sytuację dla innych części strony, w którym to przypadku może być użyteczny układ zagnieżdżony.

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

+0

Pamiętaj, aby sprawdzić [nowsze wersje] (http://guides.rubyonrails.org/v4.0.12/layouts_and_rendering.html#using-nested-layouts) tej samej dokumentacji. Nastąpiły zmiany w nowszych wersjach Railsów i linkowany przykład może już nie działać. –

5

Można mieć więcej niż jeden yield w układzie, po prostu dać z dodatkowymi nazwę:

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

Możesz dodać HTML do tej yield za pomocą metody

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

Ale musisz dodać to do każdego widoku, który chcesz mieć pasek boczny. Zamiast tworzyć views/layouts/application_with_sidebar.html.erb

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

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

Further reading

Jeśli wolisz, aby utrzymać liczbę yield s do minimum, można zagnieździć układy zamiast.

views/układy/application.html.erb

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

views/układy/application_with_sidebar.html.erb

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

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

controllers/accounts_controller.rb

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

Następnie wrzucam zmienne do głównego, globalnego układu, który nie dotyczy wszystkich sekcji witryny.Po prostu nie czuje się dobrze. Dzięki za pomysł. –

+0

@Chad Zagnieżdżone układy takie jak @mark są prawdopodobnie najlepszą alternatywą. Wszystko zależy od częstotliwości pojawiania się tego znacznika. –