## 動機
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" %>`のような設定されているかどうかに応じて挙動を切り替えるコードを短く書くことができます。