2010-10-06 17 views
6

Ho il mio layout dell'applicazione principale, ma poi ho una sezione/account del mio sito che ha esattamente lo stesso layout del layout dell'applicazione markupwise, tranne che le pagine/account hanno una barra laterale aggiunta nel area del contenuto del layout.Estensione di un layout esistente in Rails

Invece di copiare clamorosamente il layout dell'applicazione e creare un layout "account" quasi ridondante, vorrei estendere il layout dell'applicazione, aggiungendo la barra laterale nell'area del contenuto.

Così ho qualcosa di simile nel mio layout dell'applicazione:

<html> 
<body> 

<div id="content"> 

<%= yield %> 

</div> 

</body> 
</html> 

e voglio

<html> 
<body> 

<div id="content"> 

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

    <%= yield %> 

</div> 

</body> 
</html> 

C'è un modo per ottenere questo risultato senza copiare il codice?

risposta

3

Se il percorso/account è legato al controller conto, si può sempre avere un layout fullfeatured con parte condizionale come questo

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

(devo ammettere che non piace l'occhio però)

4

Spesso si avrà la stessa situazione per altre parti del sito, nel qual caso potrebbe essere logico utilizzare layout annidati.

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

+0

Assicuratevi di controllare [versioni successive] (http://guides.rubyonrails.org/v4.0.12/layouts_and_rendering.html#using-nested-layouts) della stessa documentazione. Ci sono stati cambiamenti nelle versioni più recenti di Rails e l'esempio collegato potrebbe non funzionare più. –

5

È possibile avere più di un yield in un layout, è sufficiente dare quelle aggiuntive un nome:

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

È possibile aggiungere codice HTML per quella yield utilizzando il content_for metodo

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

Ma dovrai aggiungere quello ad ogni vista che vuoi avere una barra laterale. Invece, creare views/layouts/application_with_sidebar.html.erb

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

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

Further reading

Se preferisci mantenere il numero di yield s al minimo, è possibile nidificare i layout, invece.

views/layout/application.html.erb

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

views/layout/application_with_sidebar.html.erb

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

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

controllori/accounts_controller.rb

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

Quindi sto lanciando le variabili nel layout globale principale che non si applica a tutte le sezioni del sito.Non mi sembra giusto. Grazie per l'idea. –

+0

@Chad Layout nidificati come @mark suggeriti sono probabilmente la migliore alternativa, quindi. Tutto dipende da quanto spesso ti serve questo markup per mostrarlo. –

Problemi correlati