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