2010-06-02 7 views
5

J'utilise Haml (Haml/Sass 3.0.9 - Classy Cassidy) autonome pour générer du HTML statique. Je veux créer un modèle de présentation partagé que tous mes autres modèles héritent.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 

Pour produire:

content.html

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

Mais cela ne semble pas possible. J'ai vu l'utilisation des partiels de rendu lors de l'utilisation de Haml avec Rails, mais je ne trouve aucune solution lorsque j'utilise Haml de manière autonome. Avoir à mettre le code de disposition dans tous mes modèles serait un cauchemar de maintenance; alors ma question est comment puis-je éviter de faire cela? Existe-t-il un moyen standard pour résoudre ce problème? Ai-je manqué quelque chose de fondamental?

J'ai trouvé une question similaire: Rendering HAML partials from within HAMLoutside of Rails

Répondre

4

J'ai créé un prototype qui fait ce dont j'ai besoin. J'ai juste besoin de le créer en tant que module et lui permettre d'accepter le modèle de présentation et le modèle de contenu en tant qu'arguments (avec un ensemble de données).

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. 

sortie

<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 est construit avec l'hypothèse selon laquelle il sera utilisé aux côtés de certains cadre Ruby qui offre des choses comme partials et mises en page. Si vous voulez un moyen simple de rendre le code Haml statique avec des mises en page et des partiels, consultez StaticMatic.

+0

+1 Merci, vous avez regardé StaticMatic. Il fournit exactement ce que je veux pour les modèles de mise en page, mais soulève des problèmes dans d'autres domaines. – kjfletch