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