14

बचाने पर उलट कर रहे हैं (मेरे समस्या काफी described in this question रूप में ही है, केवल कि इसका जवाब मेरे मामले में काम नहीं करता।)Rails3/jQuery के यूआई datepicker - माह और दिन


मैं उपयोग कर रहा हूँ एक पोस्टग्रेस डीबी के साथ एक रेल ऐप में jQuery UI Datepicker। डिफ़ॉल्ट कार्यान्वयन मिमी/डीडी/वाई दिनांक प्रारूप का चयन दिनांक को प्रदर्शित करने के लिए करता है, जो वास्तव में मैं चाहता हूं। हालांकि, डेटाबेस को रिकॉर्ड सहेजने के बाद, महीने और दिन उलट दिया जाता है - फिर यह yy-dd-mm के रूप में प्रदर्शित होता है। इसलिए 3/11/2012 का चयन 11 मार्च के बजाय 3 नवंबर के रूप में सहेजने की कोशिश करता है, और 3/31/2012 जैसी तारीख को सहेजा नहीं जाता है, क्योंकि यह अस्तित्व में नहीं है।

मैं नीचे 3 अलग रास्ते चले गए हैं अब तक इसे ठीक करने की कोशिश कर रहा:

1) सबसे पहले प्रयास पाठ क्षेत्र पुन: प्रारूपित करना था, इसलिए प्रदर्शन देखा मैं कैसे चाहता था:

<%= f.text_field :foo, :value => (@model.foo.blank? ? '' : @model.foo.strftime('%m/%d/%Y')), class: "datepicker" %> 

यह दिखाया गया है 03/31/2012 शुरुआत में सही ढंग से, लेकिन सहेजते समय भी उलट दिया।

2) तो अगली बार मैंने डिफ़ॉल्ट तरीके को बदलने की कोशिश की कि तारीखें संग्रहीत हैं, सोच रही है कि समस्या के आसपास हो जाएगा।

# config/locales/en.yml 
en: 
    date: 
    formats: 
     default: "%m/%d/%Y" 

यह सब पर कोई फर्क नहीं किया: this question के जवाब में बताया गया है, मैं config/स्थानों/en.yml के लिए निम्न गयी। अगला मैं this question पाया और config/initializers/इन पंक्तियों के साथ date_formats.rb बनाने की कोशिश की: ऊपर के रूप में

Date::DATE_FORMATS[:default]="%m/%d/%Y" 
Time::DATE_FORMATS[:default]="%m/%d/%Y %H:%M" 

ही, कोई फर्क नहीं।

3) कई संयोजनों के साथ खेलने के बाद, एक बात मैंने पाया कि डीआईडी ​​काम डेटपीकर प्लगइन पर मेरे कॉल में वाई-एमएम-डीडी प्रारूप निर्दिष्ट कर रहा था - यह मेरे इच्छित चीज के विपरीत है, लेकिन कम से कम तारीखों को सफलतापूर्वक सहेजा जा सकता है। तो datepicker कॉल इस तरह दिखता है:

कैलेंडर से
$(".datepicker").datepicker({ dateFormat: 'yy-mm-dd' }); 

का चयन 31 वें मार्च 2012-03-31 के साथ क्षेत्र भरता है, और अभी भी बचाने के बाद 2012-03-31 के रूप में प्रदर्शित करता है।

लेकिन मैं पृथ्वी पर एमएम/डीडी/वाई प्रारूप के साथ काम करने के लिए डेटपिकर कैसे प्राप्त कर सकता हूं? मैं कल्पना नहीं कर सकता कि यह करना मुश्किल है, लेकिन मुझे क्या याद आ रही है? क्या मुझे पोस्टग्रेस में तारीखों को संग्रहीत करने के तरीके के साथ कुछ करना है? (उन्हें दिनांक के रूप में निर्दिष्ट किया गया है, समय-समय पर नहीं।)

+0

इस पर दीवार के खिलाफ मेरे सिर को कोसने रोकने के लिए, मैंने बस 'फ़ील्ड' के बजाय अपने फ़ील्ड को 'टेक्स्ट' पर स्विच कर दिया है। यह आदर्श नहीं है, लेकिन यह बल्कि समस्या को हल करता है। – ellawren

+0

कुछ बार स्विचिंग एक अच्छा समाधान है आदर्श या नहीं। लेकिन जिज्ञासा के लिए भी आप समस्या जानना चाहेंगे, बाद में हो सकता है। –

+0

रेल 3.2.3, पोस्टग्रेस्क्ल और रूबी 1.9.3। मेरे पास डेट-फ़िकर प्रारूप mm-dd-yy पर सेट था और यह थोड़ी देर के लिए काम कर रहा था, लेकिन मैं एक रिफैक्टरिंग के माध्यम से जा रहा हूं और मैं परेशानी के बिना कुछ तिथियां सहेज सकता हूं लेकिन विशेष रूप से एक तिथि अब सहेजी नहीं जा सकती है। तो मैं yy-mm-dd पर फिर से सुधार करने जा रहा हूं और मैं देखता हूं कि क्या होता है। – thomasvermaak

उत्तर

3

वैसे यह इस बात पर निर्भर करता है कि आप अपने डेटाबेस में डेटा कैसे संग्रहीत कर रहे हैं। यदि आप RAW एसक्यूएल प्रश्नों का उपयोग करना चाहते हैं तो आप अपनी सम्मिलित क्वेरी में to_date('31 Mar 2012', 'DD Mon YYYY') का उपयोग कर सकते हैं।

Postgres 'to_datereference

अब, अपने क्लाइंट की तरफ, jQuery तिथि चयनकर्ता में आप

$.datepicker.formatDate('dd-M-yy', Yourdate); 

उपयोग कर सकते हैं मैं डीडी सोम YYYY किया जाता है क्योंकि यह स्पष्ट लगता है।आप जरूरतों के आधार पर mm/dd/yy प्रारूप या अन्य प्रारूपों का उपयोग कर सकते हैं। उन मामलों में, उपयोग करने की आवश्यकता प्रारूप postgre के to_date समारोह

कृपया नोट में, मैं कोड ऊपर का परीक्षण नहीं किया। यदि कोई समस्या है या आप किसी भी परेशानी का सामना करते हैं तो टिप्पणियां छोड़ दें।

संपादित करें:

आप अपने पटरियों में Date.parse('2011-06-18') उपयोग कर सकते हैं डेटाबेस में डेटा सम्मिलित करने से पहले देख सकते हैं और datepicker में 'yy-mm-dd' करने के लिए formatDate निर्धारित किया है।

+0

मैं समझ नहीं पा रहा हूं कि आप क्या कह रहे हैं , लेकिन मैंने डेटाबेस में डालने से पहले तिथि को पुनर्व्यवस्थित करने के लिए पहले_सेव विधि लिखने का प्रयास किया। ऐसा लगता है जैसे यह काम करेगा, लेकिन किसी कारण से, मुझे किसी भी तारीख को 12 से अधिक दिन के साथ सहेजने का प्रयास करते समय त्रुटियां मिल गईं। मुझे पता है कि ऐसा होना चाहिए क्योंकि यह दिन और महीने स्विच करने की कोशिश कर रहा है, लेकिन मैं नहीं कर सकता यह पता लगाना कि यह कहां हो रहा है। – ellawren

+0

रेल में उत्पन्न क्वेरी (और दिनांक कॉलम का मान) लॉग में देखें। ताकि जान सकें कि वास्तव में किस पक्ष की समस्या –

0

आप अपने डेटाबेस क्लस्टर के लिए विश्व स्तर पर डिफ़ॉल्ट दिनांक स्वरूप बदलने के लिए आप भी DateStyleGUC अपने postgresql.conf में सेट और फिर से लोड कर सकता है चाहते हैं:

datestyle = 'iso, mdy' 

(जो कि डिफ़ॉल्ट वैसे भी होना चाहिए।)

ध्यान दें कि इससे प्रभावित नहीं होता है कि आपके ऐप में तिथियां कैसे प्रदर्शित की जाती हैं। बस PostgreSQL कैसे अस्पष्ट इनपुट और Postgres के कुछ आउटपुट विकल्प व्याख्या करता है।


आप एक (जाहिर है) अलग कनेक्शन, जो ऐसा नहीं करता सबूत कुछ भी में psql में datestyle सेटिंग चुनते हैं। आप ऐप स्थानीय सेटिंग्स के संबंध में एक अलग datestyle सेट कर सकते हैं। आपको अपने वास्तविक कनेक्शन के अंदर सेटिंग की जांच करनी होगी (psql से नहीं)।

यदि आपका datestyle सेटिंग 'iso, mdy' है, तो यह के रूप में आप चाहते हैं यह करने के लिए काम करना चाहिए: तिथि शाब्दिक व्याख्या कर रहे हैं महीने पहले दिन। इस डेमो पर विचार करें (PostgreSQL 9.1 का उपयोग करके):

 
db=# set datestyle = 'ISO, MDY'; 
SET 
db=# select '1.12.2012'::date; 
    date 
------------ 
2012-01-12 
(1 row) 

db=# set datestyle = 'ISO, DMY'; 
SET 
db=# select '1.12.2012'::date; 
    date 
------------ 
2012-12-01 
(1 row) 

जोर मेरा।

पता लगाने के लिए है, जो विकल्प वास्तव में आपके ऐप के द्वारा स्थापित कर रहे हैं, तो आप अपने postgresql.conf में

log_statement = all 

की स्थापना की और फिर से लोड कर सकते हैं। फिर अपना ऐप शुरू करें और एक तारीख बचाएं। प्रत्येक एकल आदेश लॉग किया जाएगा।

log_statement = none 

तो क्या अपने app वास्तव में डेटाबेस के लिए भेजा अपने डाटाबेस लॉग फ़ाइलों की जाँच करें: रीसेट और (या आपकी लॉग फ़ाइलों विशाल बढ़ सकती है) बाद में फिर से लोड करने मत भूलना।


तुम भी to_date() आदेश में रुचि हो सकती है, तो आप देता है कि आप की तरह किसी भी प्रारूप में इनपुट तारीख शाब्दिक। लेकिन आपको इसकी आवश्यकता नहीं होनी चाहिए।

+0

है, मैंने 'स्टाइल दिखाया'; psql में और आईएसओ, एमडीवाई मिला, ऐसा लगता है कि यह पहले से ही सही है। – ellawren

+0

किसी भिन्न कनेक्शन में 'psql' में जांचना शायद ही कभी सबकुछ प्रमाणित करता है। मैंने अपने जवाब में कुछ और जानकारी जोड़ा। –

0

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

मैं इस तरह अपने मॉडल में before_save और attr_accessor का उपयोग कर समाप्त हो गया:

before_save :format_date 
attr_accessor :unformatted_date 

def format_date 
    self.inquiry_date = Date.strptime(self.unformatted_date, "%m/%d/%Y").to_time(:utc) 
end 

मेरे विचार में लाइन इस तरह दिखता है:

f.text_field :unformatted_date, :value => (@foo.inquiry_date.blank? ? '' : @foo.inquiry_date.strftime('%m/%d/%Y)), :id => 'datepicker'