2010-06-02 12 views
5

Sto usando Haml (Haml/Sass 3.0.9 - Classy Cassidy) autonomo per generare HTML statico. Voglio creare un modello di layout condiviso ereditato da tutti i miei altri modelli.Haml Inherit Templates

Layout.haml

%html 
    %head 
    %title Test Template 
    %body 
    .Content 

Content.haml

SOMEHOW INHERIT Layout.haml 
SOMEHOW Change the title of the page "My Content". 
    %p This is my content 

produrre:

content.html

<html> 
    <head> 
    <title>My Content</title> 
    </head> 
    <body> 
    <div class="Content"> 
     <p>This is my content</p> 
    </div> 
    </body> 
</html> 

Ma questo non sembra possibile. Ho visto l'uso di rendering parziali quando si utilizza Haml con Rails ma non si riesce a trovare alcuna soluzione quando si utilizza Haml stand-alone.

Dover mettere il codice di layout in tutti i miei modelli sarebbe un incubo di manutenzione; quindi la mia domanda è come evitare di farlo? C'è un modo standard per risolvere questo problema? Ho perso qualcosa di fondamentale?

Ho trovato una domanda simile: Rendering HAML partials from within HAMLoutside of Rails

risposta

4

Ho creato un prototipo che fa ciò di cui ho bisogno. Ho solo bisogno di creare questo come modulo e consentirgli di accettare il modello di layout e il modello di contenuto come argomenti (insieme a un set di dati).

require "haml" 

layoutTemplate = File.read('layout.haml') 
layoutEngine = Haml::Engine.new(layoutTemplate) 
layoutScope = Object.new 

output = layoutEngine.render(scope=layoutScope) { |x| 
    case x 
    when :title 
     scope.instance_variable_get("@haml_buffer").buffer << "My Title\n" 
    when :content 
     contentTemplate = File.read('page.haml') 
     contentEngine = Haml::Engine.new(contentTemplate) 
     contentOutput = contentEngine.render 
     scope.instance_variable_get("@haml_buffer").buffer << contentOutput 
    end 
} 

puts output 

layout.haml

%html 
    %head 
    %title 
     - yield :title 
    %body 
    .content 
     - yield :content 

page.haml

%h1 Testing 
%p This is my test page. 

uscita

<html> 
    <head> 
    <title> 
My Title 
    </title> 
    </head> 
    <body> 
    <div class='content'> 
<h1>Testing</h1> 
<p>This is my test page.</p> 
    </div> 
    </body> 
</html> 
2

Haml è costruito con il presupposto che sarà utilizzato a fianco di alcuni framework Ruby che fornisce le cose come parziali e layout. Se vuoi un modo semplice per eseguire il rendering del codice Haml statico con layout e partial, consulta StaticMatic.

+0

+1 Grazie a StaticMatic. Fornisce esattamente ciò che voglio per i modelli di layout ma solleva problemi in altre aree. – kjfletch