2010-04-21 14 views
5

मेरे पास एक ऐसा फॉर्म है जहां मेरे उपयोगकर्ता मेरी साइट पर पंजीकरण कर सकते हैं।ruby ​​में अग्रणी शून्य के साथ रेंज

वे फॉर्म में जन्मतिथि भरते हैं: जन्मदिन, जन्मदिन और जन्मदिन।

तो मैं रेंज का उपयोग कर रहा है इस तरह के रूप में चयन बनाने के लिए:

= f.select(:birthmonth, options_for_select((1..12))) 

लेकिन यह एक शून्य मैं की तरह के साथ एकल अंकों की संख्या शुरू नहीं करता है चाहते हैं: 01, 02, 03, 04 , 05, 06, 07, 08, 09, 10 और इतने पर ..

मैं भी इस की कोशिश की है, लेकिन यह काम नहीं किया:

= f.select(:birthmonth, options_for_select((01..12))) 

किसी को पता है कि कैसे रेंज के साथ शुरू करने के लिए प्राप्त करने के लिए अग्रणी शून्य? या फिर ऐसा करने के लिए किसी अन्य तरीके से तो मैं यह मान्यता ?:

validates_inclusion_of :birthmonth, :in => 1..12 

उत्तर

16

दिक्कत यह है कि संख्या के लिए खुद को डॉन है अग्रणी शून्य नहीं है (या, वैकल्पिक रूप से, अग्रणी शून्यों की एक अनंत संख्या है जो कभी मुद्रित नहीं होती हैं)। अग्रणी शून्य प्राप्त करने के लिए, आपको तारों की आवश्यकता है। सौभाग्य से, रूबी

= f.select(:birthmonth, options_for_select((1..12).map {|n| "%02d" % n})) 

%02d स्ट्रिंग स्वरूपण में बनाया क्षमता की इस तरह के साथ आता है। एक स्वरूपण विनिर्देशक मतलब यह है कि कि "अग्रणी शून्य अगर यह कम से कम दो अंक के साथ यह पैड।"

सत्यापन के लिए, आप एक ही रूपांतरण करने की आवश्यकता होगी:

validates_inclusion_of :birthmonth, :in => (1..12).map {|n| "%02d" % n} 

(। धन्यवाद करने के लिए @ आर-डब कि बिट ओर इशारा करते हुए के लिए)

+2

आपको पूर्णता के लिए अपने उत्तर में सही मान्यता कथन जोड़ना चाहिए। validates_inclusion_of: जन्मस्थान,: = = (1..12) .map {| n | "% 02d"% n} – rwilliams

+0

यह मान्य नहीं होगा जब मैं शून्य से शुरू होने वाली संख्या चुनता हूं। संख्याएं जो एक वैध के साथ शुरू होती हैं हालांकि – Lisinge

+0

मेरी अंतिम टिप्पणी में दी गई सत्यापन रेखा जोड़ें और इसे ठीक काम करना चाहिए। आपका वर्तमान सत्यापन वही मान नहीं है जैसा कि चक ने चुनिंदा बॉक्स के लिए अपने उत्तर में रखा था। – rwilliams

0

कोशिश गद्दी संख्या कि कम से कम 10 कर रहे हैं, इस तरह में उपयोग कर सकते हैं:

= f.select(:birthmonth, options_for_select((1..12).collect{ |i| i < 10 ? "0#{i}" : i })) 
+0

धन्यवाद! क्या मैं इसे सत्यापन में उपयोग कर सकता हूं? – Lisinge

+0

इस हैक के परिणामस्वरूप, आपके पास परिणामी सरणी में मिश्रित प्रकार होंगे, कुछ तत्व तारों में परिवर्तित हो रहे हैं, अन्य पूर्णांक के रूप में छोड़े गए हैं। यद्यपि यह संभवतः इस विशेष मामले में कोई समस्या नहीं पैदा करेगा, इस प्रकार की हैकिंग को कभी भी विकल्प के रूप में नहीं माना जाना चाहिए, कम से कम रूबी में नहीं (यह मेरे लिए PHP आदत जैसा दिखता है)। –

+0

तो मुझे यह कैसे करना चाहिए? – Lisinge

2

यदि यह महज एक प्रस्तुतिकरण मुद्दा है, आप options_for_select करने के लिए [पाठ, मूल्य] जोड़े का निर्माण और पारित कर सकते हैं उन्हें:

एक कंटेनर जहां तत्वों पहली और आखिरी (जैसे एक दो तत्व सरणी) का जवाब को देखते हुए, "रहता है" विकल्प मान के रूप में सेवा और "फर्स्ट्स "विकल्प पाठ के रूप में।

तो, कुछ की तरह:

options_for_select((1..12).map {|n| ["%02d" % n, n]}) 

इस तरह आप अपने मान्यता तर्क रखने के लिए है के रूप में सक्षम होना चाहिए।

+0

+1 शायद सबसे अच्छा जवाब, हालांकि पार्टी के लिए थोड़ा देर हो चुकी है। – rwilliams

2

rjust का उपयोग करना आसान और खूबसूरत मुझे लगता है कि होगा:

(1..12).collect{ |i| i.to_s.rjust(2,'0') } 
13

आप वास्तव में सिर्फ कर सकते हैं: '01'..'12'

संबंधित मुद्दे