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

Nic*_*s.V 12 datetime ruby-on-rails datepicker timepicker ruby-on-rails-4

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

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

gem 'bootstrap-datepicker-rails'
gem 'bootstrap-timepicker-rails'
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Nic*_*s.V 16

在@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
Run Code Online (Sandbox Code Playgroud)

使用Rails 4,需要sched_date_field和sched_time_field添加到强PARAMS 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" %>
Run Code Online (Sandbox Code Playgroud)

  • 这是一个边缘情况,但如果您使用此技术并需要对`sched_time`字段进行任何验证,它将失败.您可以尝试将`before_save`更改为`before_validation`.但同样,如果您有级联验证,这可能会失败.在这篇简短的评论中有点难以解释,但相信我,它会失败. (2认同)

Ser*_*nin 6

您可以使用date_time_attribute gem:

class MyModel < ActiveRecord::Base
  include DateTimeAttribute

  date_time_attribute :scheduled_at
end
Run Code Online (Sandbox Code Playgroud)

它可以让你设置schedule_at_datescheduled_at_time分开.设置属性后,将合并值schedule_at.


Alt*_*eez 5

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

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

<%= f.label :date_field %>
<%= f.text :date_field %>
<%= f.label :time_field %>
<%= f.text :time_field %>
Run Code Online (Sandbox Code Playgroud)

你的数据库仍然会保留一个我打电话的字段 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
Run Code Online (Sandbox Code Playgroud)

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