2010-01-25 7 views
5

Mes pages Web se composent de deux parties, disons en haut et en bas (à l'exception de l'en-tête et du pied de page - elles sont cohérentes d'une page à l'autre). Quelle est la meilleure pratique pour générer dynamiquement ces parties en fonction de l'action?Disposition des Rails en deux parties

Une approche que je suis venu avec est d'avoir vue pour le haut et partielle pour le fond; dans l'appel de mise en page céder pour le haut et rendre partiel pour le bas. Le nom du partiel est dynamiquement substitué en fonction de l'action.

Vous ne savez pas si c'est la meilleure façon de le faire.

Répondre

8

Je pense que votre idée est bonne. Dans vos vues, vous pouvez faire:

<%- content_for :top do -%> 
    […] 
<%- end -%> 

<%- content_for :bottom do -%> 
    <%= render @partial_name %> 
<%- end -%> 

Bien sûr, vous devriez vérifier si le partiel existe et fournir un comportement par défaut. Mais je pense que vous êtes au courant de cela de toute façon.

Et puis dans votre mise en page:

<div id="top"> 
    <%= yield :top %> 
</div> 

<div id="bottom"> 
    <%= yield :bottom %> 
</div> 
+0

Désolé, nous n'avons pas lu votre question correctement en premier lieu. J'ai édité ma réponse pour que cela corresponde plus à votre question. –

+0

J'aime votre approche - je vais essayer. Merci. –

1

Voici une version très simplifiée d'un DSL vue que je l'ai utilisé dans le passé. Travaillé bien pour nous. En réalité, nous avons paramétré les méthodes de l'assistant afin que nous puissions choisir parmi de nombreux partiels de mise en page à la volée (pour avoir des pages avec des barres latérales, des colonnes multiples, etc.).

# app/views/shared/_screen.erb 
<div id="screen"> 
    <div class="screen_header"> 
<%= yield :screen_header %> 
    </div> 
    <div class="screen_body"> 
<%= yield :screen_body 
    </div> 
    <div class="bottom"> 
    <%= yield :footer %> 
    </div> 
</div> 

# app/helpers/screen_helper.rb 
module ScreenHelper 

def screen(&block) 
    yield block 
    concat(render :partial => 'shared/screen') 
end 

def screen_header 
    content_for :screen_header do 
    yield 
    end 
end 

def screen_body 
    content_for :screen_body do 
    yield 
    end 
end 

def footer 
    content_for :footer do 
    yield 
    end 
end 
end 

# app/views/layouts/application.erb 
# only showing the body tag 
<body> 
    <%= yield :layout 
<body> 

# Example of a page 
# any of the sections below (except screen) may be used or omitted as needed. 
# app/views/users/index.html.erb 
<% screen do %> 
    <% screen_header do %> 
    Add all html and/or partial renders for the header here. 
    <%end%> 
    <% screen_body do %> 
    Add all html and/or partial renders for the main content here. 
    <% end %> 
    <% footer do %> 
Add all the html and/or partial renders for the footer content here. 
    <% end %> 
<% end %>