10

Come si può convertire un campo datetime mysql in due campi modulo (1) solo data, (2) solo tempo e combinare entrambi i campi in formato datetime sul modulo submit?Rails 4 - Convertire datetime in campi separati di data e ora

Ciò consentirebbe l'utilizzo dei seguenti gemme, ma conservare le date in un unico campo datetime:

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

Grazie in anticipo!

risposta

15

trovato la soluzione con l'aiuto di @Althaf

Aggiunto attributi virtuali per model.rb Utilizzato before_save callback per la conversione di nuovo a datetime.

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 

utilizzare le rotaie 4, necessaria per aggiungere sched_date_field e sched_time_field le severe params in controller.rb

Qui ci sono i campi in _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

Con parametri rigorosi, intendi "parametri forti"? Inoltre, questo codice sembra sollevare un errore variabile non definito su sched_time. –

+2

Questo è un caso marginale, ma se si utilizza questa tecnica e si richiede qualsiasi convalida nel campo 'sched_time', fallirà. Puoi provare a cambiare 'before_save' con' before_validation'. Ma ancora, questo può fallire se si hanno convalide a cascata. Un po 'difficile da spiegare in questo breve commento, ma credimi, fallirà. – Karl

+0

@ Karl cosa consiglia invece? Sto incontrando questo problema ..Sto pensando di cambiare il mio modello di dati per memorizzare data, ora e fuso orario come 3 campi separati. – Turgs

4

È possibile utilizzare gli attributi virtuali See this Railscast e se si dispone di un abbonamento pro the revised one.

In sostanza nella vista si sarebbe il seguente

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

Il database potrebbe ancora mantenere un campo che chiamerò full_date

Ora nel modello che avrebbe dovuto definire i suddetti 2 campi segue.

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 

Poiché sembra che si sta utilizzando Rails 4, dovrete permettere date_field e time_field nei parametri forti.

+0

Ho pensato che sarebbe stato il modo di farlo. Ho dovuto aggiungere alcune cose alla soluzione per farlo funzionare. – jverban

+0

Puoi citare cosa hai modificato in modo da poter modificare la mia risposta con quello che hai fatto in modo che altri potessero fare riferimento ad esso più avanti –

+0

Non riesco a capire come formattare correttamente la soluzione in questa area commenti di risposta così ho postato la soluzione qui sotto. Grazie per l'aiuto. – jverban

6

È possibile utilizzare date_time_attribute gem:

class MyModel < ActiveRecord::Base 
    include DateTimeAttribute 

    date_time_attribute :scheduled_at 
end 

Ti consentirà di impostare schedule_at_date e scheduled_at_time separatamente. Una volta impostati gli attributi, i valori verranno combinati in schedule_at.