यहाँ कोड का एक टुकड़ा है जिसका मैं अभी उपयोग कर रहा हूँ:
<%= f.select :project_id, @project_select %>
params[:pid]
जब पृष्ठ लोड किया जाता है तो उसके डिफ़ॉल्ट मान के बराबर करने के लिए इसे कैसे संशोधित किया जाए ?
यहाँ कोड का एक टुकड़ा है जिसका मैं अभी उपयोग कर रहा हूँ:
<%= f.select :project_id, @project_select %>
params[:pid]
जब पृष्ठ लोड किया जाता है तो उसके डिफ़ॉल्ट मान के बराबर करने के लिए इसे कैसे संशोधित किया जाए ?
जवाबों:
यह करना चाहिए:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
बेहतर तरीका है। यह किसी भी स्थिति के लिए अच्छा है, फॉर्म एडिट के लिए भी अच्छा है।
वर्तमान उदाहरण की सही विशेषता का उपयोग करें (जैसे @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
भी साथ काम करता है। धन्यवाद यह वास्तव में भी मेरी मदद की।
options_for_select(..., f.object.project_id )
इन सभी उत्तरों के साथ समस्या यह है कि यदि आप अपना रिकॉर्ड संपादित करने का प्रयास कर रहे हैं, तो भी वे फ़ील्ड को डिफ़ॉल्ट मान पर सेट करते हैं।
आपको अपने मौजूदा मान के लिए डिफ़ॉल्ट सेट करने की आवश्यकता है और उसके बाद ही वास्तविक डिफ़ॉल्ट पर सेट करें यदि आपके पास कोई मूल्य नहीं है। इस तरह:
f.select :field, options_for_select(value_array, f.object.field || default_value)
किसी ऐसे व्यक्ति से जो f.object.field
आपके परिचित नहीं हैं, हमेशा f.object
उस क्षेत्र के अंत में अपने क्षेत्र का नाम जोड़ें।
select2
JS प्लगइन के साथ भी काम करता है । पूरी तरह से काम करता है यदि आप एक ही फ़ॉर्म के साथ रिकॉर्ड बना रहे हैं या संपादित कर रहे हैं और विशेष रूप से प्लेसहोल्डर टेक्स्ट के साथ चयन 2 का उपयोग कर रहे हैं।
इसे इस्तेमाल करे:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
काम नहीं किया, लेकिन आपके उदाहरण ने किया।
अगर पैरामेट्स [: pid] एक स्ट्रिंग है, जो अगर एक फॉर्म से आया है, तो यह है, आपको संभवतः उपयोग करने की आवश्यकता होगी
params[:pid].to_i
सही आइटम के लिए चयन सूची में चुना जाना चाहिए
@project
वैरिएबल को डेटाबेस तालिका से एक आईडी के साथ पॉप्युलेट किया, एक शीर्षक के बजाय, इस कोड ने form.select
सहायक की पीठ पर काम किया : selected: @project
थैंक यू @danengle
मुझे समाधान मिल गया है और मैंने पाया कि मैं RoR में बहुत अधिक अनुभवहीन हूँ।
नियंत्रक के अंदर जो ऊपर वर्णित दृश्य का प्रबंधन करता है, उसे जोड़ें:
@work.project_id = params[:pid] unless params[:pid].nil?
मैं इस काम के लिए नहीं मिलता है और पाया है कि मैं न केवल सही करने के लिए "चयनित" HTML विशेषता जोड़ने के लिए आवश्यक हो सकता है <option>
टैग लेकिन यह भी करने के लिए <select>
टैग। चयनित टैग के चयनित विशेषता पर MDN के डॉक्स कहते हैं:
चयनित - बूलियन विशेषता इंगित करती है कि एक विशिष्ट विकल्प शुरू में चुना जा सकता है।
इसका मतलब है कि कोड जैसा दिखना चाहिए:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
वैकल्पिक रूप से, आप कंट्रोलर में प्रोजेक्ट_आईडी विशेषता सेट कर सकते हैं, क्योंकि f.select का पहला तर्क उस विशेष विशेषता को खींचता है।
यदि आप f ऑब्जेक्ट को प्रिंट करने का प्रयास करते हैं, तो आप देखेंगे कि f.object है जिसे चयनित आइटम प्राप्त करने के लिए जांचा जा सकता है (सभी रेल संस्करण के लिए लागू होता है> 2.3)
logger.warn("f #{f.object.inspect}")
इसलिए, उचित चयनित विकल्प प्राप्त करने के लिए निम्न स्क्रिप्ट का उपयोग करें:
:selected => f.object.your_field
इसका पहले से ही समझाया गया है, एक उदाहरण देने की कोशिश करेंगे
चयनित सूची होने दें
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' %>
माइक बेथानी के ऊपर दिए गए जवाब ने एक नया रिकॉर्ड बनाते समय डिफ़ॉल्ट मान सेट करने का काम किया और अभी भी उपयोगकर्ता द्वारा संपादित रूप में चयनित शो का मूल्य है। हालांकि, मैंने एक मॉडल सत्यापन जोड़ा और यह मुझे फॉर्म जमा करने की अनुमति नहीं देगा। यहां मेरे लिए क्या काम किया गया है कि क्षेत्र में एक मॉडल सत्यापन हो और एक डिफ़ॉल्ट मान के साथ-साथ संपादन मोड में उपयोगकर्ता द्वारा चुने गए मूल्य को प्रदर्शित करने के लिए।
<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
यह आपके लिए काम करना चाहिए। यह बस {:value => params[:pid] }
html_options चर के लिए गुजरता है।
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>