如何允许我的模型接受两种不同的日期格式?

时间:2017-02-21 17:29:10

标签: date model format ruby-on-rails-5

我正在使用Ruby on Rails 5.我的模型中有以下代码......

class User < ActiveRecord::Base
    ...
  attr_accessor :dob_string 

  def dob_string
    @dob_string || (self.dob ? self.dob.strftime('%m/%d/%Y') : "")  
  end

  def dob_string=(dob_s)
    date = dob_s && !dob_s.empty? ? Date.strptime(dob_s, '%m/%d/%Y') : nil 
    self.dob = date
  rescue ArgumentError
    errors.add(:dob, 'The birth date is not in the correct format (MM/DD/YYYY)')
    @dob_string = dob_s
  end

尽管有我的指示,但有时用户以MM-DD-YYYY的形式输入日期。所以我想做的是允许我的模型接受两种格式,MM / DD / YYYY或MM-DD-YYYY,但不混合,即MM / DD-YYYY仍然是非法的。如何修改我的模型以便它可以接受任何一种格式?

1 个答案:

答案 0 :(得分:0)

我认为这可能会满足您的需求:

class User < ActiveRecord::Base
  def dob_string
    @dob_string || (dob ? dob.strftime("%m/%d/%Y") : "")
  end

  def dob_string=(dob_s)
    unless convert_preferred_date(dob_s) || convert_acceptable_date(dob_s)
      errors.add(:dob, 'The birth date is not in the correct format (MM/DD/YYYY)')
      @dob_string = dob_s
    end
  end

  private

  def convert_preferred_date(dob_s)
    convert_date(dob_s, "%m/%d/%Y")
  end

  def convert_acceptable_date(dob_s)
    convert_date(dob_s, "%m-%d-%Y")
  end

  def convert_date(dob_s, format)
    self.dob = (dob_s && !dob_s.empty? ? Date.strptime(dob_s, format) : nil)
  rescue ArgumentError
    nil
  end
end

它有点不合适,但我无法想办法两种日期格式。如果您准备接受任何人类可读的数据格式,那么可以采用更简单的方法。

请在您自己的应用中彻底测试。我只是在Rails控制台中搞乱这个,我可能没有测试过每一个案例。希望这会有所帮助。