1 Apr
duccio

duccio il 1 April 2010 parla di Rails Snippet

Nested Layout

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>

1 Commento a “Nested Layout”

  1. Diego Giorgini il 24 April 2010 alle 13:53 dice:

    Molto bello il metodo ‘artigianale’ !
    Piccolo problema: non ne vuole sapere di funzionare con viste in HAML :-( Per caso sai come si può risolvere?

Scrivi un commento