2009-03-08 17 views
155

यहाँ है कोड का एक टुकड़ा मैं अब उपयोग कर रहा हूँ:रेल चयन सहायक - चयनित मान, कैसे डिफ़ॉल्ट?

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

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

+0

मुझे यकीन है कि है कि क्या आप चाहते हैं एक डिफ़ॉल्ट परियोजना का चयन किया, जब पेज लोड, यदि नहीं कर रहा हूँ पैराम्स हैश में चयन के मूल्य को वापस करने के लिए: पिड। – Tilendor

उत्तर

188

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

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

बिना पैरा के, 'options_for_select' बेहतर तरीका है। यह किसी भी स्थिति के लिए अच्छा है, फ़ॉर्म संपादन के लिए भी अच्छा है। –

+0

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

-2

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

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

लेकिन यह चयन में उपयुक्त आइटम का चयन नहीं करेगा: एस – totocaster

9

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

नियंत्रक दृश्य का प्रबंधन करता है कि इसके बाद के संस्करण इस ऐड वर्णित के अंदर:

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

यदि पैरामीटर [: पीआईडी] एक स्ट्रिंग है, जो अगर यह एक से आया है प्रपत्र, यह है, आपको शायद

params[:pid].to_i 

चुनिंदा सूची में सही आइटम का चयन करने की आवश्यकता होगी

+0

यह इंगित करने के लिए धन्यवाद –

+0

यह मुझे भी बचाया। यिक्स रेल, यिक्स। – rogerdpack

+0

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

108

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

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

यह सबसे अच्छा जवाब है क्योंकि यह काम करता है 'select_tag' के साथ भी। धन्यवाद, यह वास्तव में भी मेरी मदद करता है। – stephenmurdoch

+2

इसके अलावा आप 'options_for_select (..., f.object.project_id)' – 18augst

+0

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

45

रेल 3.0.9

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

इस रेल में मेरे लिए सही जवाब था 4.0.1 – tom

+0

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

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

इस प्रयास करें:

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

का उपयोग करते हुए रेल 4,' पैरामीटर [default': पीआईडी] 'काम नहीं किया है, लेकिन अपने उदाहरण था। –

+0

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

+0

मेरे लिए काम किया। आखिरकार। रेल पर था 5 – K2xL

1
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %> 
21

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

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

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

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

+3

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

+0

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन किसी को भी यह देखने को मिल सकते के लिए, इस सवाल का जवाब भी 'select2' जे एस प्लगइन के साथ काम करता है। पूरी तरह से काम करता है यदि आप एक ही फॉर्म के साथ रिकॉर्ड बना रहे हैं या संपादित कर रहे हैं और चयन 2 का उपयोग कर रहे हैं, खासकर प्लेसहोल्डर टेक्स्ट के साथ। –

0

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

0

यदि एफ ऑब्जेक्ट को मुद्रित करने का प्रयास करें, तो आप देखेंगे कि 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' %> 
2

मैं इसे काम करने के लिए नहीं मिला और पाया कि मुझे केवल "चयनित" HTML विशेषता को सही <option> टैग पर जोड़ने की आवश्यकता नहीं है, लेकिन भी<select> टैग पर। MDN's docs on the selected attribute of the select tag कहते हैं:

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

इसका मतलब है कि कोड दिखना चाहिए: PROJECT_ID सेट नहीं है, या आप चाहते हैं:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true} 
संबंधित मुद्दे