在创建动作之前,参数超出范围

时间:2014-08-27 18:12:54

标签: ruby-on-rails

我有一个新格式的文本字段:

 <%= 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?

2 个答案:

答案 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