रेलें: स्थानीय लोगों को भागमभाग के लिए वाक्य रचना के बारे में उलझन


99

रेंडरिंग "मैजिक" को समझने के साथ रेंडरिंग (धारावाहिकों और उनमें स्थानीय लोगों को शामिल करना)।

यह काम क्यों करता है:

<%= 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
नीचे एक टिप्पणी में आप कह रहे थे कि रेल आपी डॉक्स उस खोज योग्य नहीं हैं। इसके बजाय आप इस साइट का प्रयास करना चाहिए: apidock.com/rails । यह भी वहाँ पर रूबी और rspec है।
रियुगी

जवाबों:


152

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

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

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

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


5

यदि आपको निर्दिष्ट करने की आवश्यकता है: स्थानीय, आपको निर्दिष्ट करने की आवश्यकता है: आंशिक या: टेम्पलेट

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

कार्य करना चाहिए


अगर माणिक उस तरह से जिज्ञासु हो तो उसे उस तरीके से मूल्यांकन करना होगा जो हैश का करता है।
सेठवरगो

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

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

ठीक है, मैं काटता हूँ ... आप इस तरह का सामान कैसे देखते हैं? क्या आप अपने माध्यम से खुदाई करते हैं clone https://github.com/rails/rails.git? या कोई बेहतर तरीका है? क्षमा करें, लेकिन मैं अपेक्षाकृत आतंक विरोधी के लिए नया हूँ और अभी तक एक अच्छा / आसान / सुसंगत तरीका रेल प्रलेखन को देखने के लिए ... वहाँ ऐसी है कि नहीं मिला है है किसी भी। आसानी से खोजा http://api.rubyonrails.org/नहीं जा सकता। और गिट से स्रोत या तो नहीं है ... आह
Meltemi

im किसी भी तरह से एक विशेषज्ञ नहीं है, लेकिन मैं Aptana स्टूडियो का उपयोग करता हूं। इसे उसी प्लेटफॉर्म पर बनाया गया है जैसे ग्रहण (यदि आप परिचित हैं)। यह आपको "क्लिक" और ट्रेस करने की अनुमति देता है जैसे आपने कहा था। आप इन-कोड खोज भी कर सकते हैं और इसे टर्मिनल आदि में बनाया गया है। सावधानी - इसकी एक बहुत बड़ी फाइल
सेथवर्गो

2

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

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

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

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


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

उममीद है कि इससे मदद मिलेगी!


यह मदद करता है , धन्यवाद! लेकिन यह मुझे अपनी मदद करने में मदद नहीं करता है ... यदि आप जानते हैं कि मेरा क्या मतलब है ...
मेल्टमी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.