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

有没有什么办法可以检测#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是一个视图助手。

这只是把块完全留空。

你可以使用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()将返回空string,所以你可以这样做:

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

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

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

查看自述文件中的大量示例:

- no_content_for :key

  • 使用破折号( – )不等于(=)
  • 将阻止以后的content_for呈现。 这允许布局的模板覆盖。

= content_for_with_default :key

  • 用等号(=)不是破折号( – )
  • 你可以通过一个块或者一组参数来提供默认的HAML,这些参数和传递给标准的“​​render”调用相同(即:partial =>'foo',:locals => {:bar =>'巴'})。`

= content_for :key

  • 用等号(=)不是破折号( – )
  • 你提供一个块,即{render:partial =>'foo'},它将覆盖content_for_with_default。 它具有与no_content_for相同的优先级,因此无论哪个都是首先获胜,所以如果布局具有no_content_for或content_for(有或没有默认值),则模板现在可以覆盖它。

在这里更好地回答rails 3:

收益率和默认情况|| 不输出默认情况

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