我有一个新格式的文本字段:
<%= f.text_field :date_start, class: "form-control", id: "date_start" %>
文本字段中的文本格式如下:
"08/29/2014 12:00 am"
我想提交它来创建动作并解析它:
formatted_params[:date_start] = Date.strptime(formatted_params[:date_start],
'%m/%d/%Y %I:%M %p')
在Rails控制台中,这种解析工作正常:
> DateTime.strptime("08/20/2014 4:00 pm",'%m/%d/%Y %I:%M %p')
=> Wed, 20 Aug 2014 16:00:00 +0000
不幸的是,在调用控制器创建操作之前,raise会引发以下错误,并且我有机会解析它:
argument out of range
activesupport (4.1.1) lib/active_support/values/time_zone.rb
# Time.zone.parse('22:30:00') # => Fri, 31 Dec 1999 22:30:00 HST -10:00
def parse(str, now=now)
parts = Date._parse(str, false)
return if parts.empty?
time = Time.new(
parts.fetch(:year, now.year),
parts.fetch(:mon, now.month),
parts.fetch(:mday, now.day),
parts.fetch(:hour, 0),
parts.fetch(:min, 0),
如何在此处理解析而不是Rails?
答案 0 :(得分:0)
您可以覆盖date_start=
setter以添加自己的日期解析。在模型中,您要设置date_start属性,为date_start=
添加方法:
class MyModel < ActiveRecord::Base
def date_start=(s)
datetime = DateTime.strptime(s,'%m/%d/%Y %I:%M %p')
write_attribute :date_start, datetime
end
end
答案 1 :(得分:0)
你可以使用这个宝石:https://rubygems.org/gems/stringify_date 它创建了虚拟属性:
class MyModel < ActiveRecord::Base
stringify :date_start, format: '%m/%d/%Y %H:%M %p'
end
# This generates:
m = MyModel.new
m.date_start_string = "08/20/2014 4:00 pm"
m.date_start
=> Wed, 20 Aug 2014 16:00:00 +0000