如何改变Ruby on Rails解析两位数年份输入的方式

时间:2014-06-30 21:47:37

标签: ruby-on-rails ruby datetime activerecord

我有一个表单,以格式(m / d / yy)接受来自文本字段的日期。

当日期被保存时(使用ActiveRecord),它被解析为年份" 0014"而不是" 2014。"在这个领域的案例中,我希望总能把这个世纪想象成2000年。

这是控制台中的[失败]测试:

2.0.0-p247 :021 > g.update_attributes(:date_completed => "3/4/14")
   (0.3ms)  BEGIN
  SQL (0.7ms)  UPDATE `goals` SET `date_completed` = '0014-03-04', `updated_at` = '2014-06-30 21:36:06' WHERE `goal_tracker_goals`.`id` = 10
   (1.7ms)  COMMIT
 => true 
2.0.0-p247 :023 > g.date_completed
 => Sun, 04 Mar 0014 

我假设有一个ActiveRecord方法来覆盖某个地方或配置值来设置。

谢谢!

2 个答案:

答案 0 :(得分:4)

尝试:

g.date_completed=Date.parse("3/4/14")

要绕过默认区域设置,请尝试:[更新问题后这是正确的答案]

g.date_completed=Date.strptime("3/4/14","%m/%d/%y") # %m: month, %d: day, %y: 2-digit year

答案 1 :(得分:2)

大胆的解决方案,但它是唯一涵盖所有案例的解决方案。在app中的任何位置,当设置了date类型的属性时,它会在写入之前通过Date.parse()发送它。

# initializers/active_record_extension_parse_date_writer.rb

module ActiveRecordExtensionParseDateWriter

  private

  def write_attribute(attr_name, value)
    if self.class.column_types.fetch(attr_name.to_s).type == :date
      d = (Date.parse(value.to_s)) rescue nil
      super(attr_name, d)
    else
      super
    end
  end

end

# include the extension
ActiveRecord::Base.send(:include, ActiveRecordExtensionParseDateWriter)