仅限未来日期 - 在Rails模型中进行验证

时间:2015-10-27 11:20:12

标签: ruby-on-rails activerecord

我在date模型中有字段User。它只有未来的日期(从注册时刻开始)。在模型中验证它的最佳方法是什么?

我想到这样的事情:

class User < ActiveRecord::Base
  validates :name, presence: true
  validates :date, presence: true
  validate :future_event


  private

  def future_event
    errors.add(:date, "Can't be in the past!") if date < Time.now
  end
end

可以吗?

你能想到一些更简单优雅的解决方案吗?

2 个答案:

答案 0 :(得分:3)

# lib/future_validator.rb
class FutureValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    if record[attribute] < Time.now
      record.errors[attribute] << (options[:message] || "can't be in the past!")
    end
  end
end
class User < ActiveRecord::Base
  validates :name, presence: true
  validates :date, presence: true
  validates :future_event, future: true
end

答案 1 :(得分:1)

查看Date Validator Gem

validates :start_date,
  date: { after: Proc.new { Date.current }, message: 'must be after today' },
  on: :create

您可能始终想要调查Date.currentDate.today之间的差异 - Date.current是时区感知的,并将使用您的Rails应用的时区。 Date.today使用系统时间。如果一个是UTC而一个是东方,可能会有奇怪的差异。