无效日期分配的强制date_column模型验证

时间:2012-01-31 21:04:36

标签: ruby-on-rails ruby-on-rails-3 validation date model

考虑情景,

User model with name, birth_date fields(此处birth_date是可选的)

内部视图表单birth_date被指定为'31 / 31/1985',无效

理想情况下,用户对象应该是无效的,并且在birth_date字段上引发错误但是没有发生,并且用户对象以birth_date保存为空白,这完全是误导。

调试后发现,在分配属性birth_date值时,它被指定为空白,而birth_date是可选对象被保存。

u = User.new
# invalid date assignment
u.birth_date = '31/31/2011'
u.birth_date #=> nil
# valid date assignment
u.birth_date = '1/1/2011'
u.birth_date #=> Sat, 01 Jan 2011

class User < ActiveRecord::Base
  def initialize(args={})
    logger.info args[:birth_date] #invalid value comes upto here but vanishes afterwords
    super
  end
end

我不是说它不正确,但它不应该误导用户的观点。 输入无效的birth_date用户后,bcz会假设他输入了正确的birth_date,但实际上他的birth_date根本没有保存。

任何线索如何解决这个问题??

1 个答案:

答案 0 :(得分:1)

我不知道allow_blankallow_nil选项是否适用于自定义验证,但您可以自行编写。

validate :valid_birth_date

private
  def valid_birth_date
    errors.add(:birth_date, "is invalid.") unless birth_date.blank? || valid_date?(birth_date)
  end

  def valid_date?(date)
    begin
      !!Date.parse(date)
    rescue
      false
    end
  end