2008-10-11 12 views
84

में परिभाषित किया गया है, मैं वास्तविक टेम्पलेट के आधार पर लेआउट स्तर पर एक सशर्त प्रतिपादन करना चाहता हूं, content_for(:an__area) परिभाषित किया गया है, किसी भी विचार को यह कैसे किया जाए?रेल उपज की जांच करते हैं: क्षेत्र को

+0

देखें मेरी [जवाब] (http://stackoverflow.com/questions/3347322/yield-if-content-render-something-otherwise-rails-3/7409626 # 7409626) रेल में इस व्यवहार को समाहित करने के लिए एक सहायक विधि बनाने के लिए 3. – tristanm

उत्तर

193

@content_for_whatever मान्य नहीं है। उपयोग content_for? बजाय, इस तरह:

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

सहायक 'content_for?' केवल रेल में मौजूद है। रेल 2 में आप '@content_for _... 'आवृत्ति चर का उपयोग कर सकते हैं । – lest

+0

बढ़िया! मैंने इस के लिए बहुत लंबे समय तक काम-आसपास लिखा है। अब और नहीं। – morganjlopes

+2

रेल में भी काम करता है 4. महान थाक्स – daniel

1

ठीक है, मैं बिना किसी जवाब के शर्मनाक रूप से स्वयं जवाब देने जा रहा हूं और मुझे पहले ही जवाब मिल गया है :) इसे एप्लिकेशन_हेल्पर.आरबी या कहीं भी सुविधाजनक में कहीं भी एक सहायक विधि के रूप में परिभाषित करें।

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 इंस्टेंस वैरिएबल को बहिष्कृत किया गया है, इसलिए आपका समाधान भविष्य का सबूत नहीं है –

2

एक सहायक बनाया जा सकता:

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

और अपने लेआउट में इस का उपयोग करें: तो

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

: एक सहायक विधि बनाने के लिए

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

यह प्रश्न का उत्तर नहीं देता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। – eirikir

+0

मैं @ वीरिकिर से सहमत हूं, यह सुनिश्चित नहीं करता कि मेरा 6 साल का छोटा आत्म क्या सोच रहा था। मैं रेलवे 2 पर अभी भी उन लोगों के लिए अपना उत्तर बढ़ा रहा हूं और छोड़ रहा हूं .. अनावश्यक प्रस्ताव के बिना; – Nick

10

वास्तव में आवश्यक नहीं निश्चित रूप से आपके विचार में:

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

मैं यह सब समय का उपयोग सशर्त एक एक स्तंभ और दो कॉलम लेआउट

1

मैं उपज दो बार फोन करने के प्रदर्शन निहितार्थ के बारे में सुनिश्चित नहीं कर रहा हूँ के बीच जाने के लिए, लेकिन यह आंतरिक की परवाह किए बिना क्या करेंगे उपज के कार्यान्वयन (@content_for_xyz हटाई गई है) और किसी भी अतिरिक्त कोड या सहायक तरीकों के बिना:

<% if yield :sidebar %> 
    <div id="sidebar"> 
    <%= yield :sidebar %> 
    </div> 
<% end %> 
संबंधित मुद्दे