## 背景 Railsのactionviewのヘルパー関数には、`form_with`のように、blockを活用して入れ子のHTML要素を記述できる便利なヘルパーメソッドがあります。 具体的には、以下のような記述([Railsガイドより引用](https://railsguides.jp/form_helpers.html#%E4%B8%80%E8%88%AC%E7%9A%84%E3%81%AA%E6%A4%9C%E7%B4%A2%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0))が出来るヘルパーメソッドです。 ```erb <%= form_with url: "/search", method: :get do |form| %> <%= form.label :query, "Search for:" %> <%= form.text_field :query %> <%= form.submit "Search" %> <% end %> ``` blockを用いてHTML要素の入れ子を出力できるこのようなヘルパーメソッドの自作に関する話です。 ## 作り方 actionviewの`capture`というヘルパーメソッドを用いると、`form_with`のように、blockを使ってHTML要素の入れ子を記述できるヘルパーメソッドを自作できます。 ちなみに、この`capture`は、[Railsガイド](https://railsguides.jp/action_view_helpers.html#capturehelper%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)を読んでも、[RailsのAPIドキュメント](https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-capture)を読んでも、いまいち使い道が分かっていなかったのですが、このような自作ヘルパーで使うというのが1つの使い道のようです。 ### 自作ヘルパーメソッドの実装例 ```ruby def some_helper(content=nil, &block) object_passed_to_block = 'hello, capture' content = capture(object_passed_to_block, &block) if block tag.div(content, class: 'some-class') end ``` ### 自作ヘルパーメソッドの利用例 #### ERBから利用 ```erb <%= some_helper do |object| %>

<%= object %>

<% end %> ``` ##### 出力結果 ```

hello, capture

``` #### Rubyのコード内から利用 ```ruby some_helper do |object| tag.p(object) end ``` ##### 出力結果 ```

hello, capture

``` #### Rubyのコード内からblockなしで利用 ```ruby some_helper('123') ``` ##### 出力結果 ```
123
```