2008-10-11 97 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%>