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

我有一个简单的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' %>