部分的なテンプレートでブロックを使いたかった
とりあえず要所をまとめると
テンプレートを作ってヘルパーメソッドの中で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 'さらにヘルパーを使ったり', '/'
という風に使えます。ブロックが使えるので結構柔軟なヘルパーなのではないかなと思います。