Ruby on rails Rails日期验证与条件验证是否和将来?方法

Ruby on rails Rails日期验证与条件验证是否和将来?方法,ruby-on-rails,validation,rails-activerecord,Ruby On Rails,Validation,Rails Activerecord,我发现了一些重复的问答;但是,我没有弄明白 我有房子模型,该模型具有:可在验证处获得(字段为日期)。我正在努力实现这样的目标 可用日期必须在将来 #db/schema.rb 创建表格“房屋”,强制::级联do | t| # ... t、 日期“可用时间”,null:false # ... 结束 #app/models/house.rb 班级宿舍{available_at.future?} 结束 还有,这是 重复答案 这似乎是一个很好的自定义方法使用案例,该方法可以验证可用的\u\u

我发现了一些重复的问答;但是,我没有弄明白

我有
房子
模型,该模型具有
:可在
验证处获得(字段为
日期
)。我正在努力实现这样的目标

可用日期必须在将来

#db/schema.rb
创建表格“房屋”,强制::级联do | t|
# ...
t、 日期“可用时间”,null:false
# ...
结束
#app/models/house.rb
班级宿舍<申请记录
验证:available_at,presence:true,if:->{available_at.future?}
结束
还有,这是


重复答案






这似乎是一个很好的自定义方法使用案例,该方法可以验证可用的\u\u

class House < ApplicationRecord
  validate :available_at_is_in_the_future

  def available_at_is_in_the_future
    if available_at.present? && available_at <= Date.today
      errors.add(:available_at, "must be in the future")
    end
  end
end
class House
事实上,答案是完美的,但问题是保持模型干燥,而且它有很长的方法名

这就是我所做的,和

我在_future_validator.rb
上创建了一个单独的验证器,名为name
。我将文件放在
lib/validators
文件夹中

然后,我编写了这个验证器

# lib/validators/at_future_validator.rb
class AtFutureValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    if attribute.present? && value < Date.today
      object.errors[attribute] << (options[:message] || 'must be in the future')
    end
  end
end

我遵循的指南

谢谢您的回答。现在,它就像魅力一样,但我需要更新RSpecs。在那之后我会记下答案。谢谢你,马克。我补充了我的答案。你可以去看看!是的,你是对的,但关键是模型应该做模型的工作。
# lib/validators/at_future_validator.rb
class AtFutureValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    if attribute.present? && value < Date.today
      object.errors[attribute] << (options[:message] || 'must be in the future')
    end
  end
end
# app/models/house.rb
class House < ApplicationRecord
  require_dependency 'validators/at_future_validator.rb'
  # ...
  validates :available_at, presence: true, at_future: true
  # ...
end