Railsのyield
スコープに#content_for
が実際に適用されたかどうかを検出する方法はありますか?
次のような典型的な例:
<title><%= yield :page_title %></title>
テンプレートがそれを設定しない場合
<% content_for :page_title, "Something here" %>
レイアウトに代わりに何かを配置させる方法はありますか?
レイアウト自体で#content_for
を使用して定義しようとしましたが、これによりテキストが二重に表示されるだけです。私も試しました:
<%= (yield :page_title) or default_page_title %>
ここで、#default_page_title
はビューヘルパーです。
これでブロックは完全に空のままになりました。
content_for?
を使用して、特定の名前のコンテンツがあるかどうかを確認できます。
<% if content_for?(:page_title) %>
<%= yield(:page_title) %>
<% else %>
<%= default_page_title %>
<% end %>
または
<%= content_for?(:page_title) ? yield(:page_title) : default_page_title %>
次に、ビューで次のようなコンテンツを指定できます
<% content_for :page_title do %>
Awesome page
<% end %>
Rails 3以降)、リクエストされたキーのコンテンツがない場合、yield()
は空の文字列を返すため、次のようなことができます:
<title><%= yield(:page_title).presence || 'Default Page Title' %></title>
アプリケーションヘルパーで、次のように定義した場合:
def page_title(title = nil)
title ? content_for(:page_title) { title } : content_for(:page_title).presence
end
その後、次のようなことができます:
<title><%= page_title or 'Default Page Title' %></title>
そしてあなたのビューでは、次のようにカスタマイズできます:
<% page_title 'My Page Title' %>
Content_forメソッドを拡張した新しいgem dry_views をリリースしました。
受け入れられた回答に対する利点は、ビューからすべてのロジック(if/else)を削除できることです。
広範な例については、readmeを参照してください。
- no_content_for :key
= content_for_with_default :key
= content_for :key