2010-09-24 14 views
6

¿Cómo puedo hacer que el código sangría correctamente?Haml render múltiples parciales en el diseño

app/views/layouts/shared.html.haml:

= render :partial => "shared/head" 
= yield 
= render :partial => "shared/footer" 

app/views/shared/_head.html.haml:

!!!XML 
!!!1.1 
%html{"xml:lang" => "pl", :xmlns => "http://www.w3.org/1999/xhtml"} 
    %head 
    %title 
     some title 
    %body 
    .container 

app/views/shared/index. html.haml:

%p 
    Hello World! 

app/views/shared/_footer.html.haml:

.footer 
    Some copyright text 

salida HTML prestados:

<!DOCTYPE html> 
<html xml:lang='pl' xmlns='http://www.w3.org/1999/xhtml'> 
    <head> 
    <title> 
     some title 
    </title> 
    </head> 
    <body> 
    <div class='container'></div> 
    </body> 
</html> 
<p> 
    Hello World! 
</p> 
<div id='footer'> 
Some copyright text 
</div> 
+0

Pregunta muy bien articulada. – look

Respuesta

5

Debe utilizar app/views/layout para eso y yield el contenido real:

Example

actualización

app/views/layout/shared.html.haml:

!!! 1.1 
%html 
    = render "shared/head" 
    %body 
    .container 
     = yield 
    = render "shared/foot" 
+0

Cuando quiero usar el mismo encabezado parcial en múltiples diseños, debo repetirlo en todos mis diseños ... no muy DRY y no en el modo "Ruby way" – astropanic

+0

los diseños son exactamente para su problema, si tiene más diseños con el mismo subcontento renderizar aquellas partes de los lugares comunes –

+0

He puesto un ejemplo arriba, un diseño simple con cabeza y pie de página incluido, pero como puede ver no funciona – astropanic

1

Parece que llego bastante tarde a la fiesta aquí, pero quizás alguien más se encuentre con esto y tenga que lidiar con el mismo problema (como lo hice esta noche).

En mi caso, tengo una configuración más compleja para la etiqueta HTML de apertura, y varios diseños diferentes, por lo que no quería toda la repetición. Mi etiqueta HTML de apertura tiene condiciones para las diferentes versiones de IE y en un principio parecía algo como esto:

- # /app/views/layouts/shared/_head.html.haml 

!!! 5 
<!--[if lt IE 7 ]> <html lang="en" class="no-js ie ie6"> <![endif]--> 
<!--[if IE 7 ]> <html lang="en" class="no-js ie ie7"> <![endif]--> 
<!--[if IE 8 ]> <html lang="en" class="no-js ie ie8"> <![endif]--> 
<!--[if IE 9 ]> <html lang="en" class="no-js ie ie9"> <![endif]--> 
<!--[if (gte IE 9)|!(IE)]><!--> 
%html{ 'xml:lang' => 'en', lang: 'en', class: 'no-js'} 
    <!--<![endif]--> 
    %head 
    - # and so on... 

que estaba teniendo el mismo problema con </html> finalizar antes de tiempo, por lo que arrancó la etiqueta HTML del parcial _head (dejando la cabeza etiquetar allí) y creó el siguiente ayudante para hacer frente al problema:

# /app/helpers/application_helper.rb 

module ApplicationHelper 
    def render_html_tag(&block) 
    markup = capture_haml &block 
    haml = Haml::Engine.new <<-HAML 
!!! 5 
<!--[if lt IE 7 ]> <html lang="en" class="no-js ie ie6"> <![endif]--> 
<!--[if IE 7 ]> <html lang="en" class="no-js ie ie7"> <![endif]--> 
<!--[if IE 8 ]> <html lang="en" class="no-js ie ie8"> <![endif]--> 
<!--[if IE 9 ]> <html lang="en" class="no-js ie ie9"> <![endif]--> 
<!--[if (gte IE 9)|!(IE)]><!--> 
%html{ 'xml:lang' => 'en', lang: 'en', class: 'no-js'} 
    <!--<![endif]--> 
    = markup 
HAML 

    obj = Object.new 
    haml.def_method(obj, :render, :markup) 
    obj.render(markup: markup) 
    end 
end 

es un poco complicado y tal vez se pueda limpiar un poco, pero la idea principal es aprovechar la haml engine's #def_method, que permite la diseño para que se parezca a esto:

- # /app/views/layout/application.html.haml 

= render_html_tag do 
    = render 'layouts/shared/head' 
    %body 
    = yield 
    = render 'layouts/shared/footer' 
+0

No lo probé. Parece un poco complejo para una sangría simple. Pero votaré de todos modos. – look

+0

No creo que esta sea una buena solución. La plantilla compartida anterior es un enfoque mucho mejor. – Dylan

Cuestiones relacionadas