使用字符串作为带有验证的日期输入

时间:2018-08-21 08:32:04

标签: ruby-on-rails activerecord

我们经常遇到这样的情况:我们拥有诸如日期,日期时间,货币等数据库字段,用户可以将其作为字符串输入数据。这意味着数据必须先进行转换,然后才能存储在数据库中。

当前,我们正在使用类似以下的概念(我们有一个相应的库,但实际上可以归结为这一点)。在此示例中,我们有一个称为valid_from的物理日期属性。

class User < ApplicationRecord
  attribute :valid_from_str, :string

  def valid_from_str=(value)
     begin
       self.valid_from = Date.parse(value)
     rescue
       self.valid_from = nil
     end

     super
  end

  def valid_from_str
    some_date_format_method(valid_from)
  end

  validate do |user|
    begin
      Date.parse(user.valid_from_str)
    rescue
      user.errors.add :valid_from_str, :invalid
    end
  end
end

如您所见,我们创建了一个名为valid_from_str的附加虚拟属性,该属性为我们提供了可在表单中使用的getter和setter并验证了正确的日期格式。

尽管很多,但我认为使用Rails 5自定义属性类型一定可以做到这一点,例如:

class CustomDate < ActiveRecord::Type::Date
  def cast(value)
    if value.is_a?(String)
      return Date.parse(value)
    else
      return value
    end
  end
end

这基本上可行,但是它不允许我们验证用户提供的原始字符串值。

是否可以使用API​​属性实现上述示例?

0 个答案:

没有答案