2010-12-09 14 views
96

आंशिक (और उनमें स्थानीय लोगों को गुजरने) के संबंध में रेल "जादू" को समझना।रेल: आंशिक रूप से स्थानीय लोगों को गुजरने के लिए वाक्यविन्यास के बारे में भ्रमित

क्यों इस काम:

<%= render "rabbits/form" %> 

और यह काम:

<%= render "rabbits/form", :parent => @warren, :flash => flash %> 

लेकिन यह करता है नहीं काम:

<%= render "rabbits/form", :locals => { :parent => @warren, :flash => flash } %> 

लेकिन इस करता है:

<%= render :partial =>"rabbits/form", :locals => { :parent => @warren, :flash => flash } %> 

इसके अलावा, मैं इन बारीकियों को कैसे देख सकता हूं इसलिए मुझे एसओ पर लोगों को परेशान करने की आवश्यकता नहीं है?

+3

नीचे एक टिप्पणी में आप कह रहे थे कि रेल एपीआई दस्तावेज़ खोजे जाने योग्य नहीं हैं। आपको इसके बजाय इस साइट को आजमाएं: http://apidock.com/rails। इसमें रूबी और आरएसपीईसी भी है। – ryeguy

उत्तर

150

संक्षिप्त उत्तर यह है कि रेंडर विधि आपके द्वारा पारित किए गए पहले तर्क को देखती है। यदि आप हैश में पास करते हैं (जिसमें :partial => 'foo', :locals => {blah blah blah} शामिल है) तो यह आपके सभी तर्कों को हैश के रूप में पास कर देगा और तदनुसार उन्हें पार्स करेगा।

यदि आप अपनी पहली तर्क के रूप में एक स्ट्रिंग में गुजरते हैं, तो यह मानता है कि पहला तर्क आपका आंशिक नाम है, और शेष को आपके स्थानीय लोगों के रूप में पास कर देगा। हालांकि, उस बाद के कॉल में, यह वास्तव में :locals => your_locals_argument असाइन करता है, जो इस मामले में {locals hash} के बजाय पूरे :locals => {locals hash} है; यानी के बजाय, आप :locals => {:locals => {locals hash}} के साथ समाप्त हो जाते हैं।

तो मेरी सलाह हमेशा हर समय मूल्यों को हमेशा स्पष्ट रूप से पास करने के लिए होती है, और आपको कोई समस्या नहीं होगी। इसके बारे में जानने के लिए, मैं सीधे कोड पर गया (एक्शनपैक/lib/base.rb, render() रेल 2 में विधि; रेल 3 अलग है)। यह एक अच्छा अभ्यास है।

इसके अलावा, SO पर लोगों को "परेशान" करने की चिंता न करें। यही कारण है कि यह साइट मौजूद है। मैंने इससे कुछ भी सीखा।

5

यदि आप निर्दिष्ट करना होगा:

<%= render :partial => "rabbits/form", :locals => {...} %> 

काम करना चाहिए

+0

यदि आप उस तरह उत्सुक हैं तो रूबी ने हैश का मूल्यांकन करने के तरीके के साथ क्या करना है। – sethvargo

+0

वास्तव में यह काम करता है..मैंने अपने प्रश्न में निर्दिष्ट किया है ... लेकिन जो मैं सोच रहा हूं वह है * क्यों? * और यह कहां दस्तावेज है? केवल स्रोत को देखकर? और, यदि रेल में इन असंख्य बारीकियों के बारे में जानने और समझने का यही एकमात्र तरीका है तो मैं सोच रहा हूं कि स्रोत से ढूंढने और व्याख्या करने के बारे में * कैसे * और * कहां जाना है। मैं बस "रेंडर" पर क्लिक नहीं कर सकता और फिर स्रोत पर ड्रिल कर सकता हूं (वैसे भी टेक्स्टमैट के साथ नहीं) या क्या मैं कर सकता हूं? – Meltemi

+1

आह! तो आप वास्तव में रुचि रखते हैं :)। हां, इन चीज़ों को समझने का एकमात्र तरीका एक है।) आपके जैसे एक झुकाव है और बी।) स्रोत कोड देखें। मुझे नहीं पता कि स्रोत को कैसे ड्रिल करना है ... माफ करना – sethvargo

1

यहाँ http://api.rubyonrails.org/classes/ActionView/Rendering.html#method-i-render से विधि प्रस्तुत करना का स्रोत है टेम्पलेट:

def render(options = {}, locals = {}, &block) 
    case options 
    # Here is your last case 
    when Hash 
    if block_given? 
     _render_partial(options.merge(:partial => options.delete(:layout)), &block) 
    elsif options.key?(:partial) 
     _render_partial(options) 
    else 
     template = _determine_template(options) 
     lookup_context.freeze_formats(template.formats, true) 
     _render_template(template, options[:layout], options) 
    end 
    when :update 
    update_page(&block) 
    else 
    # here the first three cases 
    _render_partial(:partial => options, :locals => locals) 
    end 
end 
आंशिक या: स्थानीय लोगों, आप निर्दिष्ट करने की आवश्यकता

इस मदद की उम्मीद है!

+0

यह * मदद * करता है, धन्यवाद! लेकिन यह * मेरी मदद नहीं करता * मुझे मदद करता है ... यदि आप जानते हैं कि मेरा क्या मतलब है ... – Meltemi

2

सम्मानित होने के लिए, मुझे केवल इन उपयोग मामलों के बारे में पता है, क्योंकि मैं पिछले कुछ वर्षों से रेल के साथ रह रहा हूं और घोषणाओं को पढ़ता हूं कि इसे करने का एक नया तरीका जोड़ा गया है। मैं अक्सर इसमें गलती करता हूं, लेकिन आमतौर पर इसे आसानी से ठीक किया जाता है।

यह रेल एपीआई के उन हिस्सों में से एक है जिसे आप मुझसे पूछते हैं, तो पूरी तरह से सोचा नहीं गया है। इसने पुराने व्यवहार में से किसी को भी बगैर, वर्षों में अधिक से अधिक सिंटेक्टिक चीनी जमा की है। रेंडर विधि मधुमेह है।

इसे और भी खराब बनाने के लिए, नियंत्रक को अलग-अलग व्यवहार और व्यवहार में व्यवहार करता है। मैं यह देखने के लिए पहली तर्क की सामग्री को भी देखता हूं कि यह फ़ाइल, टेम्पलेट, एक्शन या आंशिक है या नहीं।यदि यह स्लैश के साथ शुरू होता है तो यह एक फ़ाइल है, या ऐसा कुछ है।

जब भी संभव हो, मैं छोटे नोटेशन का उपयोग करने के पक्ष में हूं। क्योंकि छोटी टिप्पणियां इरादे को अच्छी तरह से संवाद करती हैं। इसे पढ़ने पर, आमतौर पर ऐसा होता है जो आपको लगता है कि यह करता है। इसे लिखना सीधे आगे नहीं है।

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