ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

部分的なテンプレートでブロックを使いたかった

とりあえず要所をまとめると
テンプレートを作ってヘルパーメソッドの中でrender partial: 'path/to/template', locals: { param: scan(&block) }
です。

なんでこうしようと思ったのか

レイアウトのように大規模ではないものの、よく出てくるような枠部分を共通部分に見立ててテンプレート化してみたかったんです。素直にパーシャルテンプレートでもよかったのですが、コンテンツの部分はブロックで渡せるようにしたいと思ったので、これはヘルパーにするかー、となりました。でも、吐き出すHTMLを直書きするのはメンテナンスがだるそう。なので、テンプレートを使いつつ、ヘルパーと連携させてみようと思ってあれこれやってたらこうなりました。
まずはテンプレートから見ていきましょう。なんでもいいのですが今回はHamlで。

%h3.header
  = title
%article.content
  = content

例なのでまあこんなものです。次はヘルパーメソッドです。

module ApplicationHelper
  def headerd_content(title, &cotent)
    render partial: 'path/to/template', locals: { content: scan(&content), title: title }
  end
end

yieldじゃなくてブロック変数にするほうがよさげかなと思いました。あとcontent.callだと呼び出し元のビューのHTMLをエスケープして吐き出してしまい、入れ子になったようになります。
あとはビューの適当なところで

= headered_content 'タイトル' do
  適当に文章を書いたり、
  = link_to 'さらにヘルパーを使ったり', '/'

という風に使えます。ブロックが使えるので結構柔軟なヘルパーなのではないかなと思います。