2011-10-21 15 views
8

मेरे पास जन्म_डेट फ़ील्ड है जो डेटाटाइम मान के रूप में संग्रहीत है। डिफॉल्ट रेल फॉर्म हेल्पर्स एक बहुत ही अनुकूल प्रारूप को थूकते हैं, उदा। "2008-06-10 22: 33: 1 9 .000000"। नीचे वेनिला रेल मार्ग है।रेल: टेक्स्ट_फील्ड के लिए मानव-अनुकूल दिनांक प्रारूप

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :size=>"20" %> 
</div> 

मैं बस एक प्रारूप कैसे लागू कर सकता हूं? मैंने विभिन्न दृष्टिकोणों की कोशिश की, उदाहरण के लिए बार-बार काम करना चाहिए, मैंने सोचा। लेकिन जब मैं निम्नलिखित की कोशिश, मैं एक त्रुटि undefined method 'strftime' for nil:NilClass

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :value=>f.object.birth_date.strftime('%m/%d/%Y'), :size=>"20" %> 
</div> 

कुछ अन्य प्रश्न/उत्तर के आधार पर मिलता है, मैं निम्नलिखित की कोशिश की। यह गैर-शून्य मानों के लिए काम करता है, लेकिन यह बदसूरत कोड है, और यह खाली मूल्यों के लिए काम नहीं करता है (वास्तव में यह आज की तारीख दिखाता है)।

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.text_field :birth_date, :value=> Time.parse(f.object.birth_date.to_s).strftime('%m/%d/%Y'), :size=>"20" %> 
</div> 

चारों ओर खेलने में, ऐसा लगता है कि outputting f.object.birth_date, एक तारीख के रूप में व्यवहार किया जाता है बल्कि datetime से। हालांकि, जब टेक्स्ट_फील्ड (मूल, बदसूरत स्वरूपण) में प्रदर्शित होता है, तो इसमें समय शामिल होता है। यह शुक्रवार की दोपहर है, और रेल के रूपों और रूबी तिथि/समय वस्तुओं के साथ परिचित होने की मेरी संयुक्त कमी मुझे मूर्ख महसूस कर रही है।

मेरे फॉर्म को शून्य/खाली, और एक दोस्ताना तारीख को प्रदर्शित करने के लिए कोई भी आसान तरीका नहीं है?

उत्तर

10

आप एक खाली स्ट्रिंग चाहते हैं, तो birth_date खाली है, तो आप बस की जाँच करनी चाहिए कि birth_date गैर nil पहले से है:

<%= f.text_field :birth_date, :value => (f.object.birth_date.strftime('%m/%d/%Y') if f.object.birth_date), :size => "20" %> 

इस तरह से जब birth_date nil, :valuenil करने के लिए सेट हो जाता है।

+0

धन्यवाद, मुझे जो चाहिए वह करता है। मैं उलझन में था कि यह शून्य जांच के बिना ऐसा करने में त्रुटि क्यों नहीं फेंकता है। मुझे लगता है कि मैंने इसे हल किया है। यह वही करता है जो मैं चाहता हूं (हालांकि अभी भी बहुत सारे कोड की तरह लगता है)। –

+0

आपका स्वागत है। 'Nil' चेक के बिना त्रुटि को फेंकने का कारण यह है कि जब 'f.object.birth_date'' nil' है, तो आप उस पर' strftime' कॉल करने का प्रयास करेंगे। चूंकि 'शून्य' में 'स्ट्रेटटाइम' विधि नहीं है, इसलिए यह त्रुटि फेंकता है। – Claw

3

क्या आपने date_select फॉर्म बिल्डर सहायक विधि का उपयोग करने का प्रयास किया है? आप datetime_select का भी उपयोग कर सकते हैं, लेकिन ऐसा लगता है कि आप बस यहां डेट के साथ काम करना चाहते हैं।

<div class="field"> 
    <%= f.label :birth_date %> 
    <%= f.date_select :birth_date %> 
</div> 

एपीआई डॉक्स यहां हैं: http://api.rubyonrails.org/classes/ActionView/Helpers/DateHelper.html#method-i-date_select विकल्प की जरूरत पर जोड़ें।

मैंने हमेशा उस दृष्टिकोण का उपयोग किया है, या jQuery UI से एक this जैसे जावास्क्रिप्ट दिनांक चयनकर्ता का उपयोग किया है। इन दिनों अधिकांश जेएस ढांचे के लिए प्लगइन्स हैं।

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

+0

मैं अंततः एक तारीख पिकर पर जाऊंगा। Date_select साझा करने के लिए धन्यवाद, मैंने पहले इसका उपयोग नहीं किया था। हालांकि, मैं इसे एक इंटरफेस के रूप में प्यार नहीं करता। एक मानव पाठ तिथि टाइपिंग बेहतर लगता है। मैं व्यक्तिगत रूप से एक जावास्क्रिप्ट-सक्षम पिकर का एक संकर पसंद करता हूं जो आपको एक तारीख को टाइप करने देता है (जैसे आपने जिस jquery विकल्प को इंगित किया है)। –

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