content_forの挙動

2010年9月13日

Rails 3 になってから、content_forの挙動が少し変わった。

Rails 2までの動きだと

<% content_for :title do -%>
トップページ
<% end -%>

という感じでタイトルを各ビューごとに変更するような作りの場合

レイアウトのhtml.erbでは、

<title><%= yield(:title) || 'デフォルトのトップページ' %></title>

とやると、各ビューの方でcontent_for指定しなかった場合にyield(:title)がnilになるので「デフォルトのトップページ」というタイトルになるのだが

Rails 3 では、ここでyield(:title)の結果が空文字で返されるため、タイトルが設定されなくなる。

yield(:title)をnilチェックする処理を書けば問題無いが、Rails 3には、content_forを判定するメソッドが出来てるのでそれを使う。

<%= content_for?(:title) ? yield(:title) : 'デフォルトのトップページ' %>