क्या कोई मुझे स्पष्ट, सरल शब्दों में collection_select समझा सकता है?


146

मैं रेल एपीआई डॉक्स के माध्यम से जा रहा हूं collection_selectऔर वे देव-भयानक हैं।

शीर्षक यह है:

collection_select(object, method, collection, value_method, text_method, options = {}, html_options = {})

और यह एकमात्र नमूना कोड है जो वे देते हैं:

collection_select(:post, :author_id, Author.all, :id, :name_with_initial, :prompt => true)

क्या कोई सरल Userसंघात का उपयोग करके समझा सकता है (एक has_many Plans, और एक के Planअंतर्गत आता है User), मैं सिंटैक्स में क्या उपयोग करना चाहता हूं और क्यों?

संपादन 1: इसके अलावा, यह भयानक होगा यदि आपने समझाया कि यह form_helperएक नियमित रूप से कैसे काम करता है । कल्पना कीजिए कि आप इसे वेब डेवलपर को समझा रहे हैं जो वेब विकास को समझता है, लेकिन रेल के लिए 'अपेक्षाकृत नया' है। आप इसे कैसे समझाएंगे?


50
हाँ। यह सबसे भयानक दस्तावेज है जिसे मैंने कभी देखा है
जस्सीम

1
निष्पक्ष होने के लिए, प्रलेखन काफी ठीक है, बस इसमें नहीं है, FormBuilderलेकिन इसमें FormOptionsHelper: api.rubyonrails.org/classes/ActionView/Helpers/…
amiuhle

1
मेरा पसंदीदा हिस्सा वह है जब आप एक फॉर्म में collection_select का उपयोग करते हैं और जो पूरे हस्ताक्षर को बदल देता है ताकि ऑब्जेक्ट पैरामीटर सूची का हिस्सा न हो लेकिन इसके बजाय collection_select को ऑब्जेक्ट पर एक विधि के रूप में कहा जाता है। ऐसा मत सोचो कि वे डॉक्स में उल्लेख करते हैं ...
user3670743

1
यह एक ओपन सोर्स प्रोजेक्ट है: यदि दस्तावेज खराब है, तो दोष देने के लिए हमारे पास केवल खुद है; यह आश्चर्यजनक हो सकता है यदि केवल हम इसे बेहतर बनाने के लिए अपना प्रयास करेंगे। छोटे / सरल पीआर एक लंबा रास्ता तय करते हैं।
BKSpurgeon

जवाबों:


305
collection_select(
    :post, # field namespace 
    :author_id, # field name
    # result of these two params will be: <select name="post[author_id]">...

    # then you should specify some collection or array of rows.
    # It can be Author.where(..).order(..) or something like that. 
    # In your example it is:
    Author.all, 

    # then you should specify methods for generating options
    :id, # this is name of method that will be called for every row, result will be set as key
    :name_with_initial, # this is name of method that will be called for every row, result will be set as value

    # as a result, every option will be generated by the following rule: 
    # <option value=#{author.id}>#{author.name_with_initial}</option>
    # 'author' is an element in the collection or array

    :prompt => true # then you can specify some params. You can find them in the docs.
)

या आपके उदाहरण को निम्न कोड के रूप में दर्शाया जा सकता है:

<select name="post[author_id]">
    <% Author.all.each do |author| %>
        <option value="<%= author.id %>"><%= author.name_with_initial %></option>
    <% end %>
</select>

यह दस्तावेज़ में नहीं है FormBuilder, लेकिन में हैFormOptionsHelper


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

2
आप इसे कभी भी "पोस्ट [लेखक_िद]" क्यों नाम देंगे?
जसीम

@alexkv आपका धन्यवाद - क्या आप: पोस्ट, # फील्ड नेमस्पेस और: ऑथर_ड, # फील्ड नेम पैरामीटर्स (पहले दो) के महत्व पर विस्तार से बात कर पाएंगे - मैं चीजों की योजना में उनके उद्देश्य को नहीं समझ सकता / सकती हूं ' t उन्हें छोड़ा जा सकता है?
BKSpurgeon

1
पहला परम वास्तव में शून्य हो सकता है। यदि आप ऑब्जेक्ट फॉर्म बना रहे हैं, तो यह वह ऑब्जेक्ट होगा, ताकि चयन में बाकी फॉर्म के समान नामस्थान हो। यदि वह आवश्यक नहीं है, तो 1 को शून्य के रूप में छोड़ दें। दूसरा नियंत्रण का नाम है, इसलिए यदि इसे किसी ऑब्जेक्ट (1 पैरामीटर) पर फ़ील्ड को अपडेट करना है तो फ़ील्ड नाम दूसरा पैरामीटर है। यदि आप अन्य उपयोगों के लिए कुछ प्रपत्र बना रहे हैं, तो दूसरा पैरामीटर वह है जो आप चाहते हैं कि प्रपत्र नियंत्रण नाम और id'd है। एनआईएल 1 के साथ इसका उपयोग क्यों करें? शायद इसलिए: आप के लिए collection_select चाहते हैं: शीघ्र विकल्प।
एलसी

1
मुझे यह भी ध्यान देना चाहिए कि आप एक समान पैरामीटर प्राप्त कर सकते हैं जो कि प्रॉम्प्ट_टैग पर एक प्रॉम्प्ट पैरामीटर का उपयोग कर रहे हैं जो विकल्प_फोर्स_सेलेक्ट का उपयोग कर रहे हैं, जो कि संभवत: एक एनआईएल ऑब्जेक्ट के साथ एक संग्रह_सेलेक्ट के समान होगा।
एलसी

21

मैंने स्वयं कुछ चुनिंदा टैग के क्रमपरिवर्तन पर कुछ समय बिताया है।

collection_selectवस्तुओं के संग्रह से एक चुनिंदा टैग बनाता है। इसे ध्यान में रखते हुए,

object: वस्तु का नाम। इसका उपयोग टैग के नाम को उत्पन्न करने के लिए किया जाता है, और इसका उपयोग चयनित मूल्य उत्पन्न करने के लिए किया जाता है। यह एक वास्तविक वस्तु या प्रतीक हो सकता है - बाद के मामले में, उस नाम का उदाहरण चर के बंधन में देखाActionController जाता है (यानी, आपके नियंत्रक में :postकहा @postगया उदाहरण आवृत्ति के लिए दिखता है ।)

method: विधि का नाम। इसका उपयोग टैग के नाम को उत्पन्न करने के लिए किया जाता है .. दूसरे शब्दों में, उस ऑब्जेक्ट की विशेषता जिसे आप चयन से प्राप्त करने की कोशिश कर रहे हैं

collection : वस्तुओं का संग्रह

value_method : संग्रह में प्रत्येक वस्तु के लिए, इस विधि का उपयोग मूल्य के लिए किया जाता है

text_method : संग्रह में प्रत्येक वस्तु के लिए, इस विधि का उपयोग प्रदर्शन पाठ के लिए किया जाता है

वैकल्पिक पैरामीटर:

options: विकल्प जो आप पास कर सकते हैं। इन्हें हेडिंग ऑप्शंस के तहत यहां डॉक्यूमेंट किया गया है।

html_options: यहाँ जो कुछ भी पारित किया गया है, बस जेनरेट किए गए html टैग में जोड़ा गया है। यदि आप एक वर्ग, आईडी, या किसी अन्य विशेषता की आपूर्ति करना चाहते हैं, तो यह यहाँ जाता है।

आपका सहयोग इस प्रकार लिखा जा सकता है:

collection_select(:user, :plan_ids, Plan.all, :id, :name, {:prompt => true, :multiple=>true })

का उपयोग करने के संबंध form_forमें, बहुत ही सरल शब्दों में, सभी टैग के लिए, जो भीतर आते हैं form_for, जैसे। f.text_field, आपको पहले ( object) पैरामीटर की आपूर्ति करने की आवश्यकता नहीं है । यह form_forवाक्य रचना से लिया गया है।


2
समय निकालने के लिए धन्यवाद ... एकमात्र मुद्दा हालांकि, सभी ईमानदारी में, आपका स्पष्टीकरण मेरे सिर में चीजों को स्पष्ट करने में मदद नहीं करता है। आपने वास्तविक परिभाषा में बहुत सारे शब्दों का इस्तेमाल किया है। मैं आपको समय देने की सराहना करता हूं - इसलिए उसके लिए, मैंने इसे वोट दिया।
मार्केमिलिन

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