Middlemanでwrap_layoutがドキュメント通りに動かない件

middleman

ドキュメント通りにしてもhtmlが何も出力されないという問題

公式ドキュメントのこの部分によると、Nested Layoutを使いたい場合は下のようにすると書いてありますが、これだと動きません。htmlが何も出力されず白い画面となります。

1
2
3
4
5
<% wrap_layout :layout do %>
  <article>
    <%= yield %>
  </article>
<% end %>

これはMiddlemanが依存するPadrinoに変更があったためと言われています。
middleman/middleman#1269

バージョンは以下の通りです。

  • middleman (3.4.0)
  • padrino-helpers (0.12.5)

erbに"="を加えてもダメ

上記のissue内で、slimでいうところの-ではなく=を使うようになったとあったので、1行目に=を加えてみました。

1
2
3
4
5
<%= wrap_layout :layout do %>
  <article>
    <%= yield %>
  </article>
<% end %>

すると、下のようなエラーが発生します。

1
2
SyntaxError: /Users/hoge/blog/webfood/source/layouts/article.html.erb:1: syntax error, unexpected ')'
 @_out_buf << ( wrap_layout :layout do ).to_s; @_out_buf << '

エラーの全量ログはこちら

slimで"="にすると動いた!

このissueのコメントによると、erbはまだ=に対応できていないからとのことです。
slimやhamlは対応済みなので、slimで以下のようにすると動きました。

1
2
3
= wrap_layout :layout
  article
    = yield

無理やりerbでも動かす方法

どうしてもerbが使いたい人は、きれいなコードとは言えませんが以下のようにすると動きます。

1
2
3
4
5
<%= wrap_layout :layout do
  "<article>
    #{yield}
  </article>"
 end %>

まとめ

Middlemanは、Railsのhelperの使い勝手に似せるためかPadrinoというライブラリーに大きく依存しています。なので、Padrinoの仕様変更でわりと影響をうけそうです。
この件については、ドキュメントで説明しておけばよい話だと思うので、ドキュメントのほうにissueをたてました。

middleman/middleman-guides#535

羊毛や小麦