私はここでのパーティーにかなり遅れているように見えますが、おそらく他の誰かがこれに遭遇し、同じ問題に対処する必要があります (私が今夜行ったように)。
私の場合、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>
ので、_head パーシャルから HTML タグを取り除き (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'