2011-05-07 11 views
55

क्या यह पता लगाने का कोई तरीका है कि #content_for वास्तव में रेल में yield दायरे पर लागू किया गया था?रेल 3: कुछ डिफ़ॉल्ट मूल्य के साथ उपज/content_for?

एक उत्कृष्ट उदाहरण की तरह कुछ किया जा रहा:

<title><%= yield :page_title %></title> 

एक खाका तैयार नहीं है, तो यह है कि

<% content_for :page_title, "Something here" %> 

के साथ वहाँ लेआउट के बजाय किसी और वहाँ कुछ डाल करने के लिए एक तरीका है?

मैंने इसे लेआउट में #content_for के साथ परिभाषित करने का प्रयास किया, लेकिन यह टेक्स्ट को दोगुना होने का कारण बनता है। मैं भी करने की कोशिश की:

<%= (yield :page_title) or default_page_title %> 

कहाँ #default_page_title एक दृश्य के सहायक है।

यह सिर्फ ब्लॉक को पूरी तरह से खाली छोड़ दिया।

उत्तर

113

आप अगर वहाँ एक खास नाम वाली सामग्री है की जाँच करने के content_for? उपयोग कर सकते हैं:

<% if content_for?(:page_title) %> 
    <%= yield(:page_title) %> 
<% else %> 
    <%= default_page_title %> 
<% end %> 

या

<%= content_for?(:page_title) ? yield(:page_title) : default_page_title %> 

फिर अपने विचारों में आप

<% content_for :page_title do %> 
    Awesome page 
<% end %> 
+0

तुम्हें यकीन कर सकते हैं! :) धन्यवाद। – d11wtq

+2

content_for? (: शीर्षक) || 'यह एक डिफ़ॉल्ट शीर्षक है' छोटा और काम करता है;) और भी: content_for: page_title, 'बहुत बढ़िया पृष्ठ' – alex

+4

'<% = उपज (शीर्षक) .presence || 'डिफ़ॉल्ट शीर्षक'%> 'समाधान के लिए बेहतर तरीका है। –

5
की तरह सामग्री निर्दिष्ट कर सकते हैं

मैंने अभी एक नया मणि जारी किया है, dry_views, जो बढ़ाता है तरीकों के लिए ed content_for।

स्वीकार्य उत्तर पर लाभ यह है कि यह आपको अपने विचारों से सभी तर्क (अगर/अन्य) को हटाने की अनुमति देता है। (-) नहीं के बराबर (=)

  • प्रतिपादन से एक बाद content_for पाएगा एक पानी का छींटा

    - no_content_for :key

    • उपयोग:

      व्यापक उदाहरण के लिए रीडमी देखें। यह लेआउट के टेम्पलेट ओवरराइड की अनुमति देता है।

    = content_for_with_default :key

    • एक समान (=) नहीं एक पानी का छींटा का उपयोग करें (-)
    • आप डिफ़ॉल्ट एक ब्लॉक या पैरामीटर है कि जैसे ही हैं का एक सेट के माध्यम से Haml के साथ प्रदान करते हैं आप एक मानक के पास "प्रस्तुत करना" कॉल करेंगे (यानी: आंशिक => 'foo',: स्थानीय लोगों => {: बार => 'बार'}) `

    = content_for :key

    • उपयोग एक समान (=) नहीं एक डैश (-)
    • आप एक ब्लॉक के साथ इसे प्रदान, यानी {प्रस्तुत करना: आंशिक => 'foo'}, और यह content_for_with_default पार कर जाएगी।यह वही प्राथमिकता है जो no_content_for है, इसलिए जो भी पहले प्रस्तुत किया जाता है, तो यदि किसी लेआउट में या तो no_content_for या content_for (डिफ़ॉल्ट रूप से या बिना) टेम्पलेट अब इसे ओवरराइड कर सकता है।
  • 8

    3, yield() रिटर्न अगर वहाँ अनुरोधित कुंजी के लिए कोई सामग्री था, तो आप कुछ इस तरह कर सकते हैं रिक्त स्ट्रिंग रेल के रूप में:

    <title><%= yield(:page_title).presence || 'Default Page Title' %></title> 
    

    आपके आवेदन सहायक में, यदि आप निर्धारित करें:

    def page_title(title = nil) 
        title ? content_for(:page_title) { title } : content_for(:page_title).presence 
    end 
    

    तो फिर तुम कुछ इस तरह कर सकते हैं:

    <title><%= page_title or 'Default Page Title' %></title> 
    

    और अपने विचारों में आप के साथ अनुकूलित कर सकते हैं: रेल 3 यहाँ

    <% page_title 'My Page Title' %> 
    
    संबंधित मुद्दे