Se volete usare un layout dentro un altro layout potete utilizzare il plugin nested_layout che con l’helper inside_layout, vi consente di specificare il template in cui includere il contenuto del blocco successivo, vediamo un esempio:
1 <% inside_layout 'site' do -%>
2 <div class="hello">
3 <h1>Ciao</h1>
4 <%= yield %>
5 </div>
6 <% end -%>
Questa è una soluzione elegante e funzionale, ma se volete qualcosa di più “artigianale” vi fate il metodo inside_layout nell’application helper e lo usate se il layout che state facendo deve ereditare un wrapper esterno:
1 def inside_layout(layout)
2 @content_for_layout = self.output_buffer
3 self.output_buffer = render(:file => "layouts/#{layout}")
4 end
E nel vostro layout lo usate insede_layout specificando il nome del layout in cui includere i contenuti:
1 <% content_for :header do %>
2 <ul class="menu">
3 <li>menu 1</li>
4 <li>menu 2</li>
5 <li>menu 3</li>
6 <li>menu 4</li>
7 </ul>
8 <% end %>
9
10 <div class="lcol">
11 <%= yield :sidebar %>
12 </div>
13
14 <div class="content">
15 <%= yield %>
16 </div>
17
18 <% inside_layout 'site' %>
Il layout “site.erb” sarà qualcosa di questo tipo:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <title>Title</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <meta name="description" content="<%= @page_desc %>" />
7 <meta name="keywords" content= "<%= @page_keyword %>" />
8 <%= javascript_include_tag :defaults %>
9 <%= yield :script %>
10 </head>
11 <body>
12 <div id="page">
13 <div id="header">
14 <h1>LOGO</h1>
15
16 <ul class="menu">
17 <li>menu 1</li>
18 <li>menu 2</li>
19 <li>menu 3</li>
20 <li>menu 4</li>
21 </ul>
22 <%= yield :header %>
23 </div>
24
25 <div id="cont">
26 <%= yield %>
27 </div>
28
29 <div id="footer">
30 <ul class="menu">
31 <li>menu 1</li>
32 <li>menu 2</li>
33 <li>menu 3</li>
34 <li>menu 4</li>
35 </ul>
36 </div>
37 </div>
38 </body>
39 </html>
Molto bello il metodo ‘artigianale’ !
Per caso sai come si può risolvere?
Piccolo problema: non ne vuole sapere di funzionare con viste in HAML