收益率和默认情况|| 不输出默认情况
我有一个简单的yield用例,由于某些未知原因,默认情况从未显示:
在我的super_admin布局中,我有:
我的控制器
class Superadmin::GolfsController < ApplicationController layout "super_admin" def show end end
我的秀视图
有还是没有
sadmin_golfs
随着 :sadmin_golfs显示。
without :显示空字符串而不是super_admin_main
任何人都可以重现相同的行为吗?
使用括号:
<%= (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)%>
尝试<%= yield(:title).presence || 'My Default Title' %>
<%= yield(:title).presence || 'My Default Title' %>
Object#presence
等同于object.present? ? object : nil
object.present? ? object : nil
object.present? ? object : nil
(AS 3 rc docs),基本上允许带有标题的传统语法。
为什么不测试视图编译中是否有content_for或not。
在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_body_id
content_for_body_id定义是否在您的视图中有content_for。
你可以做:
<%= 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
提出未定义的方法`present’
我知道这是一个老问题,但我有一个Rails 2.3的解决方案。
我已经扩展了shingara的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 %> something else
<% end %>
要么
<%= yield_or :something, 'something else' %>
>
你可以使用content_for?(:body_id)
,代码就像。
<%= content_for?(:body_id) ? yield(:body_id) : 'super_admin_main' %>