具有不同日期/时间格式的ActiveRecord

时间:2012-04-16 14:36:52

标签: ruby ruby-on-rails-3 datetime activerecord

我们有一个应用程序,用户可以设置他/她的首选日期/时间格式。用户应在整个应用程序中以配置的格式输入datetime。现在问题是在datetime create/update时,ActiveRecord被错误地解析的格式很少。

例如,用户在hh:mm dd/MM/yyyy中设置了日期/时间格式。现在,如果用户输入17:00 04/05/2012,则会将其解析为5 PM 5 Apr, 2012,其位置应为5 PM 4 May, 2012

1.8.7 :004 > a = Article.create!(:name => 'a1', :published_at => '17:00 04/05/2012')
 => #<Article id: 2, name: "a1", published_at: "2012-04-05 17:00:00", created_at: "2012-04-16 13:54:36", updated_at: "2012-04-16 13:54:36"> 

据我所知,ruby / rails有一组预定义的格式,日期/时间字符串将根据这些格式进行评估,如果按顺序匹配任何格式,它会解析给定字符串的格式。

另一个例子

1.8.7 :006 > a = Article.create!(:name => 'a1', :published_at => '17:00 15/12/2012')
 => #<Article id: 4, name: "a1", published_at: nil, created_at: "2012-04-16 13:55:43", updated_at: "2012-04-16 13:55:43"> 

此处用户输入15 December, 2012,其已解析为nil

有人已经问过类似的问题hereruby-forum,但解决方案不适用于我的情况,因为我无法在整个应用程序中配置单个日期时间格式,因为每个用户都有自己的首选日期时间格式。

现在使用多种datetime格式,我计划在将params传递给ActiveRecord之前对其进行操作。所以步骤想要

  1. datetime地图
  2. 阅读params
  3. 使用用户首选的日期时间格式解析
  4. datetime格式化为ActiveRecord
  5. 使用的默认格式
  6. 使用重新格式化的日期时间
  7. 替换datetime中的当前params

    以下是控制器的片段

    class ArticlesController < ApplicationController
      before_filter :format_date_time, :only => [:create, :update]
      ...
      ...
      private
        def format_date_time
          datetime = params[:datetime]
          params[:datetime] = DateTime.strptime(datetime, pref_date_time_format).strftime('%c')
        end
    end
    

    有人可以验证它是否是正确的方法?如果有人提出更好的方法来实现这一点,我会感激不尽。

    谢谢, 阿米特帕特尔

1 个答案:

答案 0 :(得分:0)

我会采用我提到的方法。如果有人有更好的方法请继续分享。

谢谢,Amit Patel