Rails 3:yield / content_for有一些默认值?

时间:2011-05-07 16:06:28

标签: ruby-on-rails ruby yield

有没有办法检测#content_for是否实际应用于Rails中的yield范围?

一个典型的例子是:

<title><%= yield :page_title %></title>

如果模板未使用

设置该模板
<% content_for :page_title, "Something here" %>

有没有办法让布局把其他东西放在那里呢?

我尝试在布局中使用#content_for来定义它,但这只会导致文本加倍​​。我也尝试过:

<%= (yield :page_title) or default_page_title %>

#default_page_title是视图助手。

这只是让街区完全空了。

4 个答案:

答案 0 :(得分:118)

您可以使用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 %>

答案 1 :(得分:11)

从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' %>

答案 2 :(得分:5)

我刚刚发布了一个新的gem dry_views,它提供了增强的content_for方法。

对已接受答案的好处是,它允许您从视图中删除所有逻辑(if / else)。

请参阅自述文件以获取大量示例:

- no_content_for :key

  • 使用短划线( - )不等于(=)
  • 将阻止以后的content_for呈现。这允许模板覆盖布局。

= content_for_with_default :key

  • 使用等号(=)而不是破折号( - )
  • 您通过块提供默认HAML一组参数,这些参数与您传递给标准“渲染”调用的参数相同(即:partial =&gt;'foo' ,:locals =&gt; {:bar =&gt;'bar'})。`

= content_for :key

  • 使用等号(=)而不是破折号( - )
  • 您为其提供了一个块,即{render:partial =&gt; 'foo'},它会覆盖content_for_with_default。它具有与no_content_for相同的优先级,因此无论哪个呈现第一个获胜,所以如果布局具有no_content_for或content_for(有或没有默认值),模板现在可以覆盖它。

答案 3 :(得分:3)

在这里更好地回答rails 3:

Yield and default case || do not output default case

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