2008-10-11 98 views
84

我想根据实际模板定义content_for(:an__area)在布局级别做一个条件渲染,任何想法如何完成这个任务?Rails检查是否yield:区域在content_for中定义

+0

看到我的【答案】(http://stackoverflow.com/questions/3347322/yield-if-content-render-something-otherwise-rails-3/7409626#7409626)创建一个帮助器方法来将这种行为封装在Rails 3中。 – tristanm 2011-09-13 23:19:30

回答

193

@content_for_whatever已被弃用。 使用content_for?代替,就像这样:

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

好吧我会无耻地做一个自我答复,因为没有人回答,我已经找到答案:) 定义这是帮助方法在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 
+0

呵呵,我喜欢你的自答回答,但是......小问题,`instance_variable_defined?(content_var_name)`有点整洁,而不是测试是否它是零。第二大点,content_for实例变量已弃用,因此您的解决方案不适用于未来验证 – 2009-01-23 22:51:17

2

可以创建一个帮手:

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 %> 
+0

这不提供问题的答案。要批评或要求作者澄清,请在其帖子下方留言。 – eirikir 2015-10-06 22:19:46

+0

我同意@eirikir,不知道我的6岁小孩在想什么。我正在扩展并将我的答案留给Rails 2中的那些人......没有不必要的序言; – Nick 2015-10-07 00:52:35

10

不是真的有必要创建一个辅助方法:

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

然后当然在你看来:

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

我用这一切的时候,以一列,两列的布局

1

我不知道的呼叫产量两倍的性能影响之间有条件去,但是这会做,无论内部的实现产量(@content_for_xyz是不建议使用),没有任何额外的代码或辅助方法:

<% if yield :sidebar %> 
    <div id="sidebar"> 
    <%= yield :sidebar %> 
    </div> 
<% end %> 
2
<%if content_for?(:content)%> 
    <%= yield(:content) %> 
<%end%>