Rails 4 – 将datetime转换为单独的日期和时间字段

如何将mysql datetime字段转换为两个表单字段(1)仅限日期,(2)仅限时间,并将两个字段组合回表单提交的日期时间格式?

这将允许使用以下gem,但将日期存储在单个日期时间字段中:

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

提前致谢!

在@Althaf的帮助下找到了解决方案

model.rb添加虚拟属性使用before_save回调转换回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 

使用Rails 4,需要将sched_date_field和sched_time_field添加到controller.rb中的严格参数

以下是_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" %> 

您可以使用date_time_attribute gem :

 class MyModel < ActiveRecord::Base include DateTimeAttribute date_time_attribute :scheduled_at end 

它允许您分别设置schedule_at_datescheduled_at_time 。 设置属性后,值将合并到schedule_at

您可以使用虚拟属性请参阅此Railscast ,如果您有专业版订阅修订版 。

基本上在视图中你会得到以下内容

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

您的数据库仍会保留一个我称之为full_date的字段

现在,在您的模型中,您必须按如下方式定义上述两个字段。

 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 

由于看起来您使用的是Rails 4,因此您必须在强参数中允许date_field和time_field。