2010-08-22 14 views
1

J'ai un site basé sur Rails avec une disposition basique à deux colonnes. Sur la droite, il y a une barre latérale avec différents widgets verticaux (disons simplement). Selon la page que vous visitez, les widgets peuvent être inclus, exclus et dans un ordre différent. Ex:Application Rails avec plusieurs mises en page - comment SÉCHER?

page principale (Application)

PAGE CONTENU ...

SIDEBAR

  • Widget A
  • Widget B
  • Widget C

Page X

contenu de la page ...

SIDEBAR

  • Widget D
  • widget A
  • Widget C

page Y

contenu de la page ...

SIDEBAR

  • Widget E
  • Widget A
  • Widget B
  • Widget C

En ce moment, la façon dont je l'affichage des widgets spécifiques à la page ne sont pas très SEC. Je crée une mise en page pour chaque page, puis je copie et colle les mêmes partiels HTML et partiels de widgets encore et encore. Ex:

application.html.erb

<%= render :partial => 'shared/html_header' %> 

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 

    <%= render :partial => "shared/head" %>  

    <body>       
     <div id="outer"> 

      <%= render :partial => 'shared/banner' %> 
      <%= render :partial => 'shared/nav' %> 

      <div id="main"> 
       <table cellpadding="0" cellspacing="0" border="0" style="width:100%;"> 
        <tr style="vertical-align:top;"> 

        <td style="width:759px;"> 
        <%= render :partial => 'shared/content' %> 
        </td> 

         <td><%= image_tag("spacer.gif", :width => "5") %></td> 

         <td style="width:252px;"> 
          <%= render :partial => 'shared/widget_a' %> 
          <%= image_tag("spacer.gif", :height => "10") %> 

          <%= render :partial => 'shared/widget_b' %> 
          <%= image_tag("spacer.gif", :height => "10") %> 

          <%= render :partial => 'shared/widget_c' %> 
          <%= image_tag("spacer.gif", :height => "10") %> 

         </td> 
        </tr> 
       </table> 
      </div> 
      <%= render :partial => 'shared/footer' %> 
     </div> 
      <%= render :partial => 'shared/user_voice_widget_script' %> 
      <%= render :partial => 'shared/google_analytics_script' %> 
    </body> 
</html> 

Je fondamentalement juste répéter ce modèle pour les autres mises en page, mais avec les widgets spécifiques à la page. Ne semble pas trop sec. Je pense qu'il doit y avoir un moyen plus efficace de le faire. Aucune suggestion?

Répondre

6

Vous pouvez utiliser un seul fichier de disposition qui définit la structure à deux colonnes pour toutes vos pages, puis utiliser l'assistant content_for de Rail pour remplir contextuellement votre barre latérale, en fonction de la page visitée. Ensuite, la seule information spécifique à la page est le détail de la barre latérale, et non la totalité de la mise en page répétée encore et encore.

Dans votre (unique) mise en page de l'application:

<td style="width:252px;"> 
    <%= yield :sidebar %> 
</td> 

Quelque part dans vos pages:

<% content_for :sidebar do %> 
    <%= render :partial => 'shared/widget_a' %> 
    <%= image_tag("spacer.gif", :height => "10") %> 

    ... 

<% end %> 

Si assez des combinaisons widget se produisent souvent ensemble, vous pourriez envisager de mettre leurs render directives ensemble dans partials et en utilisant ceux dans votre bloc content_for. La technique générale est décrite here