10

आप एक mysql डेटाटाइम फ़ील्ड को केवल दो फॉर्म फ़ील्ड्स (1) दिनांक में परिवर्तित कर सकते हैं, केवल (2) समय केवल, और दोनों फ़ील्ड को फ़ॉर्म सबमिट पर डेटाटाइम प्रारूप में वापस जोड़ सकते हैं? पहले सेरेल 4 - डेटाटाइम को अलग-अलग दिनांक और समय फ़ील्ड में कनवर्ट करें

gem 'bootstrap-datepicker-rails' 
gem 'bootstrap-timepicker-rails' 

धन्यवाद:

यह निम्न जवाहरात के उपयोग की अनुमति होगी, लेकिन एक भी datetime क्षेत्र में दिनांक की दुकान!

उत्तर

15

model.rb प्रयुक्त before_save कॉलबैक दिनांक को वापस परिवर्तित करने के लिए करने के लिए

जोड़ा आभासी विशेषताओं @Althaf से मिले मदद से समाधान।

before_save :convert_to_datetime 

def sched_date_field 
    sched_date.strftime("%d/%m/%Y") if sched_date.present? 
end 

def sched_time_field 
    sched_time.strftime("%I:%M%p") if sched_time.present? 
end 

def sched_date_field=(date) 
    # Change back to datetime friendly format 
    @sched_date_field = Date.parse(date).strftime("%Y-%m-%d") 
end 

def sched_time_field=(time) 
    # Change back to datetime friendly format 
    @sched_time_field = Time.parse(time).strftime("%H:%M:%S") 
end 

def convert_to_datetime 
    self.sched_time = DateTime.parse("#{@sched_date_field} #{@sched_time_field}") 
end 

का उपयोग करते हुए रेल 4, controller.rb में सख्त पैरामीटर को sched_date_field और sched_time_field जोड़ने की जरूरत

यहाँ _form.html.erb में क्षेत्र हैं

<%= f.label :sched_date_field, "Scheduled Date" %> 
<%= f.text_field :sched_date_field, :class => "datepicker" %> 

<%= f.label :sched_time_field, "Scheduled Time" %> 
<%= f.text_field :sched_time_field, :class => "timepicker" %> 
+0

सख्त पैराम द्वारा, क्या आपका मतलब "मजबूत पैरा" है? साथ ही, यह कोड शेड_टाइम पर एक अपरिभाषित चर त्रुटि उत्पन्न करने लगता है। –

+2

यह एक बढ़त मामला है, लेकिन यदि आप इस तकनीक का उपयोग करते हैं और 'sched_time' फ़ील्ड पर किसी भी सत्यापन की आवश्यकता है, तो यह असफल हो जाएगा। आप 'first_save' को' pre_validation' में बदलने का प्रयास कर सकते हैं। लेकिन फिर, यदि आपके पास कैस्केडिंग सत्यापन हैं तो यह असफल हो सकता है। इस छोटी टिप्पणी में व्याख्या करने के लिए थोड़ा मुश्किल है, लेकिन मेरा विश्वास करो, यह असफल हो जाएगा। – Karl

+0

@ करल आप इसके बजाय क्या सिफारिश करते हैं? मैं इस समस्या में भाग रहा हूँ ..मैं दिनांक, समय और टाइमज़ोन को 3 अलग-अलग फ़ील्ड के रूप में स्टोर करने के लिए अपना डेटा मॉडल बदलने की सोच रहा हूं। – Turgs

4

आप आभासी विशेषताओं See this Railscast का उपयोग कर सकते हैं और यदि आपके पास प्रो सदस्यता the revised one है।

मूल रूप से आप निम्नलिखित हैं ध्यान में रखते हुए

<%= f.label :date_field %> 
<%= f.text :date_field %> 
<%= f.label :time_field %> 
<%= f.text :time_field %> 

आपका डेटाबेस अभी भी एक क्षेत्र है जो मैं अपने मॉडल में अब full_date

फोन करता हूँ रखना होगा आप के रूप में ऊपर 2 क्षेत्रों को परिभाषित करने के लिए होगा इस प्रकार है।

def date_field # What this returns will be what is shown in the field 
    full_date.strftime("%m-%d'%y") if full_date.present? 
end 

def time_field 
    full_date.strftime("%I:%M%p") if full_date.present? 
end 

def time_field=(time) 
    full_date = DateTime.parse("#{date_field} #{time_field}) 
end 

के बाद से ऐसा लगता है कि आप रेल 4 का उपयोग कर रहे हैं, तो आप अपने मजबूत मापदंडों में DATE_FIELD और time_field अनुमति देने के लिए करना होगा।

+0

मैंने सोचा कि यह ऐसा करने का तरीका होगा। इसे काम करने के लिए मुझे आपके समाधान में कुछ चीजें जोड़नी पड़ीं। – jverban

+0

क्या आप उल्लेख कर सकते हैं कि आपने क्या बदला है, इसलिए मैंने आपके उत्तर को जो कुछ किया है उसके साथ संपादित कर सकते हैं ताकि अन्य लोग इसे बाद में देख सकें –

+0

इस उत्तर टिप्पणी क्षेत्र में समाधान को सही तरीके से प्रारूपित करने के तरीके को कैसे काम नहीं कर सका, इसलिए मैंने नीचे समाधान पोस्ट किया। आपकी सहायता के लिए धन्यवाद. – jverban

6

आप date_time_attribute gem का उपयोग कर सकते हैं:

class MyModel < ActiveRecord::Base 
    include DateTimeAttribute 

    date_time_attribute :scheduled_at 
end 

यह आपको schedule_at_date और scheduled_at_time अलग से सेट करने की अनुमति देगा। एक बार गुण सेट हो जाने पर, मान schedule_at में एकत्र किए जाएंगे।

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