Middlemanでerbのコードブロックをerbに書く方法

middleman

記事内にerbのコードブロックを書くとエラーが発生

私は記事をMarkdownで書いていますが、より柔軟に変数やロジックを使いたいため、拡張子を.html.md.erbとし、erbで動的に生成したMarkdownがhtmlに変換されるようにしています。

その記事内で以下のコードを書きました。

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

すると以下のエラーが発生しました。

1
RuntimeError: Tried to render a layout (calls yield) at /Users/hoge/blog/webfood/source/articles/2015-11/middleman-wrap-layout-doesnt-work-as-the-doc/index.html.md.erb like it was a template. Non-default layouts need to be in source/layouts.

エラーの全量はこちら

原因

erbのファイルなので、erbのコードが実行されてしまうということです。実行されるべき場所ではないので、エラーが発生します。

解決策

%を2つにするとerbのコードをエスケープ(実行されないように)できます。見た目は意図した通り%1つだけ表示されます。具体的には以下のように書きます。

拡張子が.html.md.erbの場合

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

拡張子が.html.erbの場合

1
2
3
4
5
6
7
<% code("erb") do %>
<%% wrap_layout :layout do %>
  <article>
    <%%= yield %>
  </article>
<%% end %>
<% end %>

参考

erbのタグをエスケープするには%% とパーセントを2つ書く。

羊毛や小麦