web-dev-qa-db-ja.com

Rails 3:いくつかのデフォルト値でyield / content_for?

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はビューヘルパーです。

これでブロックは完全に空のままになりました。

59
d11wtq

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 %>
120
Dylan Markow

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' %>
12
Joshua Coady

Content_forメソッドを拡張した新しいgem dry_views をリリースしました。

受け入れられた回答に対する利点は、ビューからすべてのロジック(if/else)を削除できることです。

広範な例については、readmeを参照してください。

- no_content_for :key

  • 等しくない(=)ダッシュ(-)を使用する
  • 後のcontent_forがレンダリングされないようにします。これにより、レイアウトをテンプレートで上書きできます。

= content_for_with_default :key

  • ダッシュ(-)ではなく等号(=)を使用する
  • ブロックまたはを介してデフォルトのHAMLを提供し、標準の「レンダー」コールに渡すのと同じ一連のパラメータ(つまり:partial => 'foo'、:locals => {:bar => 'bar'}) `

= content_for :key

  • ダッシュ(-)ではなく等号(=)を使用する
  • ブロック、つまり{render:partial => 'foo'}を指定すると、content_for_with_defaultがオーバーライドされます。これはno_content_forと同じ優先順位を持つため、最初にレンダリングされた方が優先されます。したがって、レイアウトにno_content_forまたはcontent_for(デフォルトの有無にかかわらず)がある場合、テンプレートでオーバーライドできます。
5
Peter H. Boling

Rails 3のより良い答えはこちら:

収量とデフォルトのケース||デフォルトのケースを出力しない

<%= yield(:title).presence || 'My Default Title' %>

3
cyrilchampier