2010-01-25 15 views
5

mie pagine web sono costituiti da due parti, diciamo alto e in basso (ad eccezione di intestazione e piè di pagina - questi sono coerente fra le pagine). Qual è la migliore pratica per generare dinamicamente quelle parti a seconda dell'azione?Rails in due parti layout

Un approccio che ho escogitato è di avere vista per la parte superiore e parziale per il fondo; nel rendimento della chiamata di layout per la parte superiore e il rendering parziale per la parte inferiore. Il nome del partial viene sostituito dinamicamente a seconda dell'azione.

Non sono sicuro che sia il modo migliore per farlo.

risposta

8

Penso che la tua idea è bene. Nelle tue visualizzazioni puoi fare:

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

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

Ovviamente si dovrebbe verificare se il partial esiste e fornire un comportamento predefinito. Ma penso che tu ne sia a conoscenza comunque.

E poi nel layout:

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

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

Spiacente, non ho letto abbastanza bene la tua domanda in primo luogo. Modificato la mia risposta in modo che si riferisse di più alla tua domanda. –

+0

Mi piace il tuo approccio - sarà fare un tentativo. Grazie. –

1

Ecco una versione molto semplificata di un DSL vista che ho usato in passato. Ha funzionato bene per noi. In realtà noi parametrizzato i metodi che la helper così abbiamo potuto scegliere da molti parziali di layout al volo (per avere pagine con barre laterali, colonne multiple, ecc).

# 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 %>