2010-06-02 2 views
5

Я использую Haml (Haml/Sass 3.0.9 - Classy Cassidy) автономно для генерации статического HTML. Я хочу создать общий шаблон макета, который наследуют все мои другие шаблоны.Шаблоны Haml Inherit

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 

Для производства:

content.html

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

Но это не представляется возможным. Я видел использование частичных рендерингов при использовании Haml с Rails, но не могу найти решение при использовании Haml в автономном режиме.

Необходимость поставить код макета во всех моих шаблонах будет кошмаром обслуживания; поэтому мой вопрос: как мне избежать этого? Существует ли стандартный способ решения этой проблемы? Я пропустил что-то фундаментальное?

Я нашел подобный вопрос: Rendering HAML partials from within HAMLoutside of Rails

ответ

4

Я создал прототип, который делает то, что мне нужно. Мне просто нужно создать это как модуль и позволить ему принимать шаблон макета и шаблон контента в качестве аргументов (вместе с набором данных).

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. 

Выход

<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 построен в предположении, что она будет использоваться вместе с какой-то основой Ruby, которая предоставляет такие вещи, как частичные и макеты. Если вам нужен простой способ визуализации статического кода Haml с макетами и частицами, посмотрите StaticMatic.

+0

+1 Спасибо, смотрел StaticMatic. Он обеспечивает именно то, что я хочу для шаблонов макета, но вызывает проблемы в других областях. – kjfletch