带有条件验证的 Rails 日期验证 if 和 future? 方法



我发现了一些重复的问答;但是,我没有弄清楚。

我有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

最新更新