Haml визуализирует несколько частей в макете

Как правильно сделать отступ кода?

приложение/представления/макеты/shared.html.haml:

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

приложение/просмотры/общий/_head.html.haml:

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

приложение/просмотры/общий/index.html.haml:

%p
  Hello World!

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

.footer
  Some copyright text

Выведенный HTML-вывод:

<!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> 

person astropanic    schedule 24.09.2010    source источник
comment
Очень хорошо сформулированный вопрос.   -  person look    schedule 21.06.2012


Ответы (2)


Вы должны использовать app/views/layout для этого и yield фактический контент:

Пример

Обновить

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

!!! 1.1
%html
  = render "shared/head"
  %body
    .container
      = yield
  = render "shared/foot"
person KARASZI István    schedule 24.09.2010
comment
Когда я хочу использовать один и тот же частичный заголовок на нескольких макетах, я должен повторить его на всех своих макетах... не очень СУХОЙ и не в стиле Ruby. - person astropanic; 25.09.2010
comment
макеты именно для вашей проблемы, если у вас есть больше макетов с тем же подконтентом, визуализируйте эту часть из общих мест - person KARASZI István; 25.09.2010
comment
Я разместил пример выше, простой макет с включенным верхним и нижним колонтитулом, но, как вы видите, он не работает. - person astropanic; 25.09.2010
comment
Как видно на Вашем примере, когда у Вас больше раскладок, для каждой из них нужно скопировать первые 6 строк... ugly aproach - person astropanic; 25.09.2010
comment
6 строк не большая цена за использование haml - person KARASZI István; 25.09.2010

Похоже, я довольно опоздал на вечеринку, но, возможно, кто-то еще столкнется с этим и ему нужно будет решить ту же проблему (как я сделал сегодня вечером).

В моем случае у меня более сложная настройка для открывающего тега HTML и несколько разных макетов, поэтому я не хотел повторяться. Мой открывающий HTML-тег имеет условия для разных версий IE и первоначально выглядел примерно так:

- # /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...

У меня была та же проблема с преждевременным завершением </html>, поэтому я вырвал тег HTML из партиала _head (оставив там тег head) и создал следующий помощник для решения проблемы:

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

Это немного беспорядочно и, возможно, его можно немного почистить, но основная идея заключается в том, чтобы воспользоваться преимуществами #def_method движка haml, который позволяет макету выглядеть примерно так:

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

= render_html_tag do
  = render 'layouts/shared/head'
  %body
    = yield
  = render 'layouts/shared/footer'
person Anthony Navarre    schedule 15.01.2012
comment
Я не пробовал. Кажется немного сложным для простого отступа. Но я все равно проголосую. - person look; 21.06.2012
comment
Я не думаю, что это хорошее решение. Приведенный выше общий шаблон — гораздо лучший подход. - person Dylan; 14.08.2012