रेलें सहायक का चयन करती हैं - डिफ़ॉल्ट चयनित मान, कैसे?


181

यहाँ कोड का एक टुकड़ा है जिसका मैं अभी उपयोग कर रहा हूँ:

<%= f.select :project_id, @project_select %>

params[:pid]जब पृष्ठ लोड किया जाता है तो उसके डिफ़ॉल्ट मान के बराबर करने के लिए इसे कैसे संशोधित किया जाए ?


मुझे यकीन नहीं है कि पेज लोड होने पर आप एक डिफ़ॉल्ट प्रोजेक्ट का चयन करना चाहते हैं, अगर: project_id सेट नहीं है, या यदि आप परम हैश में चयन के मान को वापस करना चाहते हैं: pid।
तिलेंडर

जवाबों:


222

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

<%= f.select :project_id, @project_select, :selected => params[:pid] %>

5
परमेस के बिना, options_for_selectबेहतर तरीका है। यह किसी भी स्थिति के लिए अच्छा है, फॉर्म एडिट के लिए भी अच्छा है।
एड्रियानो रेनेडे

यहाँ कुंजी है: अपने फ़ंक्शन पर LOOK करें (Options_for_select () बनाम f.select। याद रखें ये अलग-अलग कार्य हैं।
फ्लाइंग वी

126

वर्तमान उदाहरण की सही विशेषता का उपयोग करें (जैसे @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

4
यह सबसे अच्छा जवाब है क्योंकि यह select_tagभी साथ काम करता है। धन्यवाद यह वास्तव में भी मेरी मदद की।
स्टीफनमुर्डोच

7
इसके अलावा आप कोशिश कर सकते हैंoptions_for_select(..., f.object.project_id )
उद्घाटन

बहुत बहुत धन्यवाद! अन्य सभी स्वीकृत उत्तर यह नहीं कहते कि चर के माध्यम से चयन कैसे करें।
माइक बेलेंजर

52

रेल 3.0.9

select options_for_select([value1, value2, value3], default)

मैं इस समाधान को समझ नहीं सकता जब तक मैं मान सरणी के चारों ओर अपने बंद कोष्ठक देखा पहले अल्पविराम है कि आपके डिफ़ॉल्ट मान को अलग करती है ... मैं इस ब्रैकेट यहाँ याद कियाvalue3], default
BigRon

33

इन सभी उत्तरों के साथ समस्या यह है कि यदि आप अपना रिकॉर्ड संपादित करने का प्रयास कर रहे हैं, तो भी वे फ़ील्ड को डिफ़ॉल्ट मान पर सेट करते हैं।

आपको अपने मौजूदा मान के लिए डिफ़ॉल्ट सेट करने की आवश्यकता है और उसके बाद ही वास्तविक डिफ़ॉल्ट पर सेट करें यदि आपके पास कोई मूल्य नहीं है। इस तरह:

f.select :field, options_for_select(value_array, f.object.field || default_value)

किसी ऐसे व्यक्ति से जो f.object.fieldआपके परिचित नहीं हैं, हमेशा f.objectउस क्षेत्र के अंत में अपने क्षेत्र का नाम जोड़ें।


3
यह एक साफ समाधान है, और जैसा कि आप उल्लेख करते हैं कि आप केवल नए पर डिफ़ॉल्ट मूल्य और वर्तमान मूल्य को संपादित करना चाहते हैं।
21

1
मुझे पता है कि यह एक पुराना धागा है, लेकिन जो भी इसके पार आ सकता है, उसके लिए यह उत्तर select2JS प्लगइन के साथ भी काम करता है । पूरी तरह से काम करता है यदि आप एक ही फ़ॉर्म के साथ रिकॉर्ड बना रहे हैं या संपादित कर रहे हैं और विशेष रूप से प्लेसहोल्डर टेक्स्ट के साथ चयन 2 का उपयोग कर रहे हैं।
cdouble.bhuck

मुझे लगता है कि यह उत्तर के रूप में स्वीकार किया जाना चाहिए, जैसे @ माईक बेथानी ने कहा कि अन्य सभी उत्तर यह मानते हैं कि प्रपत्र केवल नए रिकॉर्ड के लिए प्रदान किया जाता है जब रेल दृष्टिकोण फॉर्म का पुन: उपयोग करना होता है। कुडोस माइक
एरिक कैस्ट्रिलो

22

इसे इस्तेमाल करे:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

रेल 4 का उपयोग करना, params[:pid]काम नहीं किया, लेकिन आपके उदाहरण ने किया।
एरिक वानिक जूल 25'13

यह मेरे लिए काम कर रहा है क्योंकि मैं "f.fields_for" के अंदर एक आंशिक का उपयोग कर रहा हूं धन्यवाद।
ह्यूगो

11

अगर पैरामेट्स [: pid] एक स्ट्रिंग है, जो अगर एक फॉर्म से आया है, तो यह है, आपको संभवतः उपयोग करने की आवश्यकता होगी

params[:pid].to_i  

सही आइटम के लिए चयन सूची में चुना जाना चाहिए


इस जवाब से मुझे अपने मुद्दे को समझने में मदद मिली। मेरा चयन बॉक्स गतिशील है और डेटाबेस से एक संग्रह खींच रहा है। मैं एक आइटम द्वारा नहीं, एक शीर्षक द्वारा डिफ़ॉल्ट चयन को पॉप्युलेट करने की कोशिश कर रहा था। इस उत्तर ने मुझे उस मुद्दे को देखने में मदद की, और एक बार मैंने अपने @projectवैरिएबल को डेटाबेस तालिका से एक आईडी के साथ पॉप्युलेट किया, एक शीर्षक के बजाय, इस कोड ने form.selectसहायक की पीठ पर काम किया : selected: @projectथैंक यू @danengle
क्रिस्टोफर वारिंगटन

10

मुझे समाधान मिल गया है और मैंने पाया कि मैं RoR में बहुत अधिक अनुभवहीन हूँ।

नियंत्रक के अंदर जो ऊपर वर्णित दृश्य का प्रबंधन करता है, उसे जोड़ें:

@work.project_id = params[:pid] unless params[:pid].nil?


3

मैं इस काम के लिए नहीं मिलता है और पाया है कि मैं न केवल सही करने के लिए "चयनित" HTML विशेषता जोड़ने के लिए आवश्यक हो सकता है <option>टैग लेकिन यह भी करने के लिए <select>टैग। चयनित टैग के चयनित विशेषता पर MDN के डॉक्स कहते हैं:

चयनित - बूलियन विशेषता इंगित करती है कि एक विशिष्ट विकल्प शुरू में चुना जा सकता है।

इसका मतलब है कि कोड जैसा दिखना चाहिए:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}


0

वैकल्पिक रूप से, आप कंट्रोलर में प्रोजेक्ट_आईडी विशेषता सेट कर सकते हैं, क्योंकि f.select का पहला तर्क उस विशेष विशेषता को खींचता है।


0

यदि आप f ऑब्जेक्ट को प्रिंट करने का प्रयास करते हैं, तो आप देखेंगे कि f.object है जिसे चयनित आइटम प्राप्त करने के लिए जांचा जा सकता है (सभी रेल संस्करण के लिए लागू होता है> 2.3)

logger.warn("f #{f.object.inspect}")

इसलिए, उचित चयनित विकल्प प्राप्त करने के लिए निम्न स्क्रिप्ट का उपयोग करें:

:selected => f.object.your_field 

0

इसका पहले से ही समझाया गया है, एक उदाहरण देने की कोशिश करेंगे

चयनित सूची होने दें

select_list = { eligible: 1, ineligible: 0 }

तो निम्नलिखित कोड में परिणाम है

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

तो डिफ़ॉल्ट रूप से चयनित विकल्प बनाने के लिए हमें चयनित: मान का उपयोग करना होगा ।

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

अगर can_vote? यह सही है कि यह चयनित सेट करता है : 1 तब पहला मूल्य दूसरे के लिए चुना जाएगा।

select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
  <option value="1">eligible</option>
  <option selected="selected" value="0">ineligible</option>
</select>

यदि चयनित विकल्प जल्दबाजी के बजाय सिर्फ एक सरणी सूची है तो चयनित उदाहरण के लिए चयनित होने के लिए सिर्फ मूल्य होगा

select_list = [ 'eligible', 'ineligible' ]

अब चयनित सिर्फ ले जाएगा

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

0

माइक बेथानी के ऊपर दिए गए जवाब ने एक नया रिकॉर्ड बनाते समय डिफ़ॉल्ट मान सेट करने का काम किया और अभी भी उपयोगकर्ता द्वारा संपादित रूप में चयनित शो का मूल्य है। हालांकि, मैंने एक मॉडल सत्यापन जोड़ा और यह मुझे फॉर्म जमा करने की अनुमति नहीं देगा। यहां मेरे लिए क्या काम किया गया है कि क्षेत्र में एक मॉडल सत्यापन हो और एक डिफ़ॉल्ट मान के साथ-साथ संपादन मोड में उपयोगकर्ता द्वारा चुने गए मूल्य को प्रदर्शित करने के लिए।

  <div class="field">
    <%= f.label :project_id, 'my project id', class: "control-label" %><br>
    <% if @work.new_record? %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
    <% else %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
    <% end %>
  </div>

मॉडल सत्यापन

  validates :project_id, presence: true

-2

यह आपके लिए काम करना चाहिए। यह बस {:value => params[:pid] }html_options चर के लिए गुजरता है।

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>

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