ruby-on-rails - Rails 4 中的最佳日期验证?

标签 ruby-on-rails ruby validation date

在 Ruby on Rails 中验证日期的最佳方法是什么?我需要确保“生日”是一个日期,小于 125 年前并且不在未来(今天可以)。

我试过三种方法:

1) date_validator gem

我使用了以下代码(安装 gem 之后):

validates :birthday, 
date: {
  after: Proc.new {Time.now - 125.years}, message: :after,
  before: Proc.new {Time.now}, message: :cannot_be_in_the_future
  }

这有效除了我可以将日期设置为数字 12 并通过验证。

2) 在自定义验证方法中检查日期是否在日期范围内,如下所示:

from = 125.years.ago.to_date
to = Time.now.to_date
unless (from..to).include? birthday
  errors.add(:birthday, :custom_error_msg)
end

这很好用并通过了我的所有测试,缺点是您只会收到一条错误消息。对于 future 日期、时间太久以前以及输入不是日期的情况,我希望有单独的错误消息。

3) 在自定义验证方法中进行多次检查,如下所示:

begin
  birthday.to_date
rescue
  errors.add(:birthday, "must be a date")
else
  if birthday > Time.now
    errors.add(:birtday, "cannot be in the future")
  elsif birthday < Time.now - 125.years
    errors.add(:birthday, "cannot be over 125 years ago")
  end
end

这也通过了我的所有测试,并且我收到了如上所述的不同消息。

所以我想知道,这是最好的方法吗?是否可以对其进行改进(除了错误消息文本需要修改)?

谢谢

最佳答案

对于这个简单的验证,我认为下面的 ruby​​ 代码就足够了!
请检查:

validate :is_valid_dob?

  private
  def is_valid_dob?
    if((birthday.is_a?(Date) rescue ArgumentError) == ArgumentError)
      errors.add(:birthday, 'Sorry, Invalid Date of Birth Entered.')
    end
  end

关于ruby-on-rails - Rails 4 中的最佳日期验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27943700/

相关文章:

ruby - 如何在出现特定单词后添加换行符

javascript - 针对特定数字的表单验证 javascript

sql - 如何使用 hstore 进行 IN 查询?

ruby-on-rails - Rails 的地理定位 API

ruby-on-rails - 在 select_tag 中,使用 options_from_collection_for_select ,如何在 ruby​​ on rails 中设置选定元素

python - Django - 使用特殊表达式的 RegexValidator

android - 立即验证检查 edittext 字段的输入(整数类型)

ruby-on-rails - 如何将 Rails 代码添加到 div 标签中的 id 属性?

ruby-on-rails - 在 Ruby 中的两个字符之间提取子链接

ruby - 如何使用 Middleman 显示 Gravtar?