我发现了一些重复的问答;但是,我没有弄清楚。
我有House
具有:available_at
验证的模型(该字段为Date
(。我正在努力实现这样的事情。
可用日期必须是将来的日期。
# db/schema.rb
create_table "houses", force: :cascade do |t|
# ...
t.date "available_at", null: false
# ...
end
# app/models/house.rb
class House < ApplicationRecord
validates :available_at, presence: true, if: -> { available_at.future? }
end
另外,这是公关
重复答案 条件验证 轨道
模型 如果另一个验证
有效,则进行条件验证 仅当条件轨道时验证唯一性 日期验证随
年龄 如何在
轨道中验证日期?
https://codereview.stackexchange.com/questions/110262/checking-for-valid-date-range-in-rails
感谢马克·梅里特,因为我启发了他的回答。答案按预期工作,但问题是保持模型干燥,而且它的方法名称很长。
我创建了单独的验证器,名称为at_future_validator.rb
。我把文件放在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
还行。第一部分已经完成。重要的部分是,我现在在指南中看到,使用我们命名为at_future_validator
的自定义验证器。我们需要在house
模型中要求验证器。
# app/models/house.rb
class House < ApplicationRecord
require_dependency 'validators/at_future_validator'
# ...
validates :available_at, presence: true, at_future: true
# ...
end
我遵循的指南
#211 Rails 3 中的验证 - 8:09
对于验证available_at的自定义方法来说,这似乎是一个很好的用例......
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