有没有办法检测#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
是视图助手。
这只是让街区完全空了。
答案 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_with_default :key
= content_for :key
答案 3 :(得分:3)
在这里更好地回答rails 3:
Yield and default case || do not output default case
<%= yield(:title).presence || 'My Default Title' %>