Rails检查是否在content_for中定义了yield:area

我想根据实际的模板定义content_for(:an__area)在布局级别做一个条件渲染,任何想法如何做到这一点?

@content_for_whatever已被弃用。 使用content_for? 相反,像这样:

 <% if content_for?(:whatever) %> <div><%= yield(:whatever) %></div> <% end %> 

没有必要创build一个辅助方法:

 <% if @content_for_sidebar %> <div id="sidebar"> <%= yield :sidebar %> </div> <% end %> 

那么当然在你看来:

 <% content_for :sidebar do %> ... <% end %> 

我一直使用这个有条件地在一列和两列之间进行布局

 <%if content_for?(:content)%> <%= yield(:content) %> <%end%> 

可以创build一个帮手:

 def content_defined?(var) content_var_name="@content_for_#{var}" !instance_variable_get(content_var_name).nil? end 

并在你的布局中使用这个:

 <% if content_defined?(:an__area) %> <h1>An area is defined: <%= yield :an__area %></h1> <% end %> 

好吧,我将无耻地做一个自我答复,因为没有人回答,我已经find了答案:)定义这是帮助方法在application_helper.rb或任何你发现方便。

  def content_defined?(symbol) content_var_name="@content_for_" + if symbol.kind_of? Symbol symbol.to_s elsif symbol.kind_of? String symbol else raise "Parameter symbol must be string or symbol" end !instance_variable_get(content_var_name).nil? end 

我不确定调用yield两次的性能影响,但是不pipeyield的内部实现如何(不推荐使用@content_for_xyz),也没有任何额外的代码或辅助方法:

 <% if yield :sidebar %> <div id="sidebar"> <%= yield :sidebar %> </div> <% end %>