2010-06-24 18 views
25

मैं एक आंशिक है, _flash.html.hamlफ्लैश संदेश (रेल 3)

- flash.each do |type, value| 
    .flash{ :class => type.to_s } 
    = value 

कौन सा मैं एक दृश्य से प्रतिपादन कर रहा हूँ

=render :partial => "flash"

कौन शिकायत है कि फ्लैश हैश है का उपयोग करते हुए शून्य/अपरिभाषित। बहरहाल, यह जब मैं कार्य करें:

=render :partial => "flash", :locals => {:flash => flash}

यह काम करता है।

आंशिक रूप से फ़्लैश संदेश तक पहुंच क्यों नहीं है?

उत्तर

24

रेल (रेल 2) के पिछले संस्करणों में, डिफ़ॉल्ट स्थानीय चर माता-पिता में आंशिक के समान नाम के साथ एक इंस्टेंस वैरिएबल की तलाश करेगा।

आपके उदाहरण को देखते हुए आंशिक नाम _flash है, यह स्वचालित रूप से आंशिक रूप से आवृत्ति चर फ्लैश को स्थानीय रूप से पास कर देगा। इस प्रकार आपको इसका उपयोग होगा। यह व्यवहार 2.3 में बहिष्कृत किया गया था और रेल 3.0 में हटा दिया गया है।

इसका मतलब है कि आपको हमेशा सभी उदाहरण चर को locals, flash के रूप में स्पष्ट रूप से पास करना होगा, जैसा कि आपने अपने बाद के उदाहरण में लिखा था।

<%= render :partial => "flash", :locals => {:flash => flash} %>

यह flash कहते प्रति के साथ कोई संबंध नहीं है, flash किसी भी अन्य के रूप में एक उदाहरण चर रहा है।

+2

लेकिन 'फ्लैश' मूल दृश्य में एक आवृत्ति चर नहीं है, यह 'एक्शन व्यू :: बेस' पर एक विधि है, जो अनिवार्य रूप से एक सहायक विधि के समान है। तो आंशिक कॉल में 'फ्लैश' क्यों एक ही विधि नहीं है? – John

+8

ऐसा इसलिए है क्योंकि नेमस्पेस छायांकन। आंशिक फ्लैश नाम दिया गया है, इसलिए यह मूल टेम्पलेट में फ्लैश आईवर को आंशिक रूप से विभाजित करने के लिए आंशिक नाम फ्लैश को सुरक्षित करता है, भले ही फ़्लैश भी मौजूद है या नहीं। जैसा कि @ टोथमेरियो ने उत्तर दिया, इसका नामकरण कुछ और नामस्थान छाया को रोक देगा। – Cluster

+0

@ क्लस्टर, मुझे लगता है कि तुमने मेरा दिमाग उड़ा दिया। कभी-कभी मुझे आश्चर्य होता है कि क्या रेल "मैजिक" अपने स्वयं के अच्छे के लिए बहुत ही जादुई नहीं है। – guiniveretoo

22

क्योंकि आपके आंशिक का नाम "_flash" है, तो आपके पास आंशिक के अंदर परिवर्तनीय फ्लैश निर्दिष्ट करने के लिए ऑब्जेक्ट स्थानीय होना चाहिए।

अपने आंशिक नाम बदलें और आप के अंदर फ्लैश उपयोग करने के लिए, उदाहरण के लिए सक्षम हो जाएगा:

= render "show_flash_names" 
+1

मैंने इस्तेमाल किया = 'लेआउट/flash_messages' प्रस्तुत करें। मुझे स्पष्ट रूप से स्थानीय लोगों से गुजरने से बेहतर समाधान पसंद है। (: locals => {: flash => flash} इतना verbose है - yuck) –

+2

इस पर +1: बस इसे "फ्लैश" नाम न दें और आप रेल की फ्लैश ऑब्जेक्ट तक पहुंच सकते हैं जैसा आप चाहते हैं। –

+0

यह जवाब है! – brad

4

यह भी अपने वांछित परिणाम प्राप्त होगा:

<%= render partial: "flash", object: flash %>

flash वस्तु किया जा रहा है admin/shared/flash को आंशिक रूप से flash के रूप में विभाजित किया गया है, क्योंकि आंशिक को flash कहा जाता है। आपके पास आंशिक रूप से flash ऑब्जेक्ट तक पहुंच होगी क्योंकि आप किसी भी नियमित दृश्य में इसकी अपेक्षा करेंगे।

5

प्रत्येक आंशिक एक संदर्भ में प्रस्तुत किया जाता है जिसमें एक अंतर्निहित स्थानीय चर होता है जिसका नाम आंशिक (अग्रणी अंडरस्कोर को छोड़कर) होता है। तो _flash.html.haml आंशिक होगा always में flash स्थानीय है जो ActionView::Base#flash छाया करता है। आप (आंशिक करने के लिए एक तर्क पारित नहीं करते हैं या तो :locals => {:flash => flash} या :object => flash के माध्यम से, स्थानीय का मूल्य केवल nil है।

के रूप में सुझाव दिया, आप नाम संघर्ष से बचने के लिए आंशिक नाम बदल सकते हैं, या अधिक वर्बोज़ का उपयोग render पर कॉल करें।

यह मेरी राय में, रेल की एक परेशान ग़लत है, और I'd like to see it changed है।

+0

यह सबसे पूरा जवाब है, कारण और संभावित कामकाज की आपूर्ति। मैं इस "फीचर" से "आश्चर्य" को हटाने के प्रयासों की भी सराहना करता हूं। –

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