## 動機 Rails 8.0.2でrails newをして生成されたapp/views/layouts/application.html.erbでは、 以下のように`yield :foo`と`content_for :foo`が混在していました。 ```erb <%= content_for(:title) || "Sample" %> (中略) <%= yield :head %> ``` [content_forのAPIドキュメント](https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for)によれば `yield :foo`と`content_for :foo`の働きが等価となる場合もあるのですが、 このapplication.html.erbの例のように、片方に統一されず両方を利用しているケースがあったので、 `yield :foo`と`content_for :foo`の使い分けについて調べる事にしました。 ## 結論 - 基本的には、`yield :foo`を使う。ただし、以下の2つのケースでは`content_for :foo`を使う。 - ケース1:ヘルパーメソッドの中では、yieldは利用できないので、`content_for :foo`を使う。 - ケース2:ビュー側で設定されているかどうかに応じて挙動を切り替えるコードを短く書くときには`content_for :foo`を使う。 ## 詳細 ### yieldはヘルパーメソッドの中では利用できない [content_forのAPIドキュメント](https://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#method-i-content_for)に書かれている通り、 content_forは以下の例のようにヘルパーメソッド内で利用可能ですが、yieldは利用できません。 ```ruby module StorageHelper def stored_content content_for(:storage) || "Your storage is empty" end end ``` ### yieldとcontent_forでは、設定されていないときの戻り値が異なる ビュー側で以下のように:fooに対して設定が行われていた場合、 ```erb <% content_for :foo do %> Foo <% end %> ``` `yield :foo`と`content_for :foo`の戻り値は、この例ではどちらも`" Foo\n"`であり、同じになります。 しかし、ビュー側で前述のような記述がなく:fooに対して設定が行われていなかった場合、 `yield :foo`の戻り値が空文字列(`""`)であるのに対し、`content_for :foo`の戻り値は`nil`であり、 戻り値が異なります。 設定されていない場合に`content_for :foo`が`nil`を戻す性質を利用することで、`<%= content_for(:title) || "Sample" %>`のような設定されているかどうかに応じて挙動を切り替えるコードを短く書くことができます。