2015-01-07 5 views
25

प्रदान करें, मैं आज के हेल्पर फ़ंक्शन "प्रदान" दृश्य में आया हूं। अपने मैनुअल को देखकर मैं अभी भी उलझन में हूं कि यह "content_for" से अलग कैसे है।रेल पर रूबी: बनाम सामग्री_for

प्रदान (नाम, सामग्री = शून्य, & ब्लॉक)

content_for के रूप में ही, लेकिन जब सीधे वापस लेआउट के लिए स्ट्रीमिंग flushes के साथ प्रयोग किया। दूसरे शब्दों में, यदि आप दिए गए टेम्पलेट को प्रस्तुत करते समय एक ही बफर में कई बार जोड़ना चाहते हैं, तो आपको सामग्री का उपयोग करना चाहिए, यदि नहीं, तो को रोकने के लिए लेआउट को बताने के लिए प्रदान करें।

प्रश्न 1: यह मेरे लिए काफी सार है - क्या कोई इसे प्रदर्शनकारी उदाहरण देकर इसे बाहर कर सकता है?

प्रश्न 2: संपत्ति पाइपलाइन के साथ काम करना, जो बेहतर प्रदर्शन करता है और क्यों?

धन्यवाद!

+2

क्या आप http://api.rubyonrails.org/classes/ActionController/Streaming.html से परिचित हैं? –

+0

ईमानदारी से, इसका उल्लेख करने से पहले कोई नहीं। मैंने आपके द्वारा साझा किए गए रेफरी पर एक नज़र डाली, और यह उत्कृष्ट है। कभी नहीं पता था कि डिफ़ॉल्ट रूप से रेल लेआउट से पहले टेम्प्लेट लोड करते हैं! तो स्ट्रीमिंग इस आदेश को वापस करने का तरीका है। फिर..? – Bruce

+0

यह ठीक है कि इसे कैसे कार्यान्वित किया गया है, स्ट्रीमिंग का मुख्य लाभ पृष्ठ के कुछ हिस्सों (विशेष रूप से हेडर जेएस) को पूरे पृष्ठ की प्रतीक्षा करने के बजाय ब्राउज़र पर वापस स्ट्रीम करने के लिए सक्षम करना है। –

उत्तर

22

सबसे पहले, स्ट्रीमिंग क्या है? आप इसका इस्तेमाल क्यों करेंगे?

स्ट्रीमिंग पृष्ठों को टॉप-डाउन (बाहरी-इन) प्रस्तुत करने का वैकल्पिक तरीका है। डिफ़ॉल्ट प्रतिपादन व्यवहार अंदरूनी है। स्ट्रीमिंग अपने नियंत्रक में सक्षम होना चाहिए:

class MyController 
    def action 
    render stream: true # Streaming enabled 
    end 
end 

documentation के अनुसार:

स्ट्रीमिंग हल्के कार्यों नए या संपादित की तरह के लिए overkill माना जा सकता है। स्ट्रीमिंग का वास्तविक लाभ महंगी क्रियाओं पर है, उदाहरण के लिए, डेटाबेस पर बहुत से प्रश्न पूछें।

तो, यदि आप स्ट्रीमिंग का उपयोग नहीं कर रहे हैं, तो क्या अभी भी कोई अंतर है?

हां।

अंतर एक टेम्पलेट कई सामग्री ब्लॉक को content_for पर कॉल करके कई बार परिभाषित कर सकता है।ऐसा करने से ब्लॉक को श्रेणीबद्ध और लेआउट है कि पारित करेंगे:

# layout.html.erb 
<div class="heading"><%= yield :surprise %></div> 
<div class="body"> 
    <p><%= yield %></p> 
    <p>But it's not very interesting...</p> 
</div> 

# template.html.erb 
<%= content_for :surprise, "Hello" %> 
I've got your content! 
<%= content_for :surprise, ", World!" %> 

# Generated HTML 
<div class="heading">Hello, World!</div> 
<div class="body"> 
    <p>I've got your content!</p> 
    <p>But it's not very interesting...</p> 
</div> 

provideके बाद से खोज प्रदान की गई टेम्पलेट जारी रखने के लिए नहीं है, केवल पहली provide कॉल को दिया गया ब्लॉक टेम्पलेट को भेज दिया जाएगा:

# layout.html.erb 
<div class="heading"><%= yield :title %></div> 

# template.html.erb 
<%= provide :title, "Foo" %> 
<%= provide :title, "bar" %> 

# Generated HTML 
<div class="heading">Foo</div> 
+1

'view_flow' में * प्रदान करें * सामग्री * संलग्न करें। कुंजी के लिए सामग्री को ओवरराइट करने का एकमात्र तरीका 'content_for' विकल्प' flush: true' के साथ प्रयोग कर रहा है। – mmtootmm

5

देखने के लिए क्या अंतर था उत्सुक था, और Thong Kuah के रूप में, एपीआई की ओर इशारा किया जवाब के अंदर:

इसका मतलब है कि, यदि आप उपज है: अपने लेआउट में शीर्षक और आप स्ट्रीमिंग का उपयोग करना चाहते हैं , शीर्षक और स्ट्रीमिंग के उद्देश्य को मारने वाली सभी संपत्तियों को स्ट्रीम करने से पहले आपको संपूर्ण टेम्पलेट (और अंततः सभी प्रश्नों को ट्रिगर करना होगा) प्रस्तुत करना होगा। इस कारण से रेल 3.1 ने एक नया सहायक प्रदान किया है जिसे प्रदान किया जाता है जो content_for जैसा ही करता है लेकिन लेआउट को अन्य प्रविष्टियों के लिए खोजना बंद करने और प्रतिपादन जारी रखने के लिए कहता है।

संबंधित मुद्दे