Haml на рендер несколько фрагментов в макете
как я могу сделать отступ кода правильно?
app / views / макеты / общий доступ.формат 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
визуализированный вывод 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>
2 ответов
вы должны использовать app/views/layout
для этого и yield
само содержание:
обновление
app/views/layout/shared.html.haml
:
!!! 1.1
%html
= render "shared/head"
%body
.container
= yield
= render "shared/foot"
похоже, я довольно поздно на вечеринку здесь, но, возможно, кто-то еще столкнется с этим и должен справиться с той же проблемой (как и я сегодня вечером).
в моем случае у меня есть более сложная настройка для открытия 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 partial (оставив там тег 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
это немного грязно, и, возможно, его можно немного очистить, но основная идея состоит в том, чтобы воспользоваться двигатель haml #def_method, что позволяет макету выглядеть примерно так:
- # /app/views/layout/application.html.haml
= render_html_tag do
= render 'layouts/shared/head'
%body
= yield
= render 'layouts/shared/footer'