我有一个简单的yield用例,由于某些未知原因,默认情况从未显示过:
在我的super_admin布局中,我有:
<%= yield :body_id || 'super_admin_main' %>
我的控制器
class Superadmin::GolfsController < ApplicationController
layout "super_admin"
def show
end
end
我的节目视图
有无
<% content_for(:body_id) do %>sadmin_golfs<% end %>
使用:显示sadmin_golfs。
没有:显示空字符串而不是super_admin_main
任何人都可以重现相同的行为吗?
答案 0 :(得分:26)
尝试<%= yield(:title).presence || 'My Default Title' %>
Object#presence
相当于object.present? ? object : nil
(AS 3 rc docs),基本上允许使用标题的传统语法。
答案 1 :(得分:19)
使用括号:
<%= (yield :body_id) || 'super_admin_main' %>
或者
<%= yield(:body_id) || 'super_admin_main' %>
没有它们就假设yield (:body_id || 'super_admin_main')
编辑:Rails 3使用ActiveSupport::SafeBuffer
而不是string / nil(Rails 2),因此即使没有提供content_for
,输出也不是nil。所以试试:
<%= yield(:body_id).empty? ? 'super_admin_main' : yield(:body_id)%>
答案 2 :(得分:3)
为什么不测试视图编译中是否有content_for定义。
在content_for代码中,我们可以看到:
def content_for(name, content = nil, &block)
ivar = "@content_for_#{name}"
content = capture(&block) if block_given?
instance_variable_set(ivar, "#{instance_variable_get(ivar)}#{content}".html_safe)
nil
end
因此,在您的情况下,如果您的视图中包含content_for,则定义@content_for_body_id
。
你可以:
<%= instance_variable_defined?('@content_for_body_id') ? yield(:body_id) : 'super_admin_main' %>
如果您愿意,可以在
之后生成助手def yield_or(part, result)
instance_variable_defined?("@content_for_#{part}") ? instance_variable_get("@content_for_#{part}") : result
end
并通过
在您的视图中调用它<%= yield_or(:body_id, 'super_admin_main') %>
它仅适用于Rails 2.3.x
在Rails 3中:
有这种方法content_for?
答案 3 :(得分:1)
在rails 3中
引发未定义的方法`present'
答案 4 :(得分:1)
我知道这是一个老问题,但我有一个Rails 2.3的解决方案。
我上面已经扩展了shingara's yield_or辅助方法,所以它现在可以接受一个块:
module ApplicationHelper
def yield_or(name, content = nil, &block)
ivar = "@content_for_#{name}"
if instance_variable_defined?(ivar)
content = instance_variable_get(ivar)
else
content = block_given? ? capture(&block) : content
end
block_given? ? concat(content) : content
end
end
,这可以在您的模板中使用:
<% yield_or :something do %>
<p>something else</p>
<% end %>
或
<%= yield_or :something, 'something else' %>
答案 5 :(得分:0)
<div class= <%= (yield :content_with_bunners).present? ? yield(:content_with_bunners) : "col-md-10"%>>
答案 6 :(得分:0)
您可以使用content_for?(:body_id)
,代码就像。
<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %>