返回布尔结果的块是否可以直接用于ActiveRecord验证?

时间:2014-11-06 19:12:01

标签: ruby-on-rails rails-activerecord

如果我有一个属性,我想做一个自定义验证,有一个真/假结果,我知道我可以做一些事情,如:

validates_each :start_at do |record, attr, v|
  record.errors.add(attr, 'must be in the future') if v < Time.now
end

但在这种情况下,必须直接访问记录对象似乎有些过分。我希望能够做一些更精简的事情,例如:

validates :start_at, message: 'must be in the future', using: Proc.new { |v| v < Time.now }

甚至:

validates_by_block(:start_at, message: 'must be in the future') { |v| v < Time.now }

Rails是否提供这样的方法或选项?

1 个答案:

答案 0 :(得分:1)

在Rails中不支持验证器。您必须自己编写自定义验证器:

validates :start_at, :presence => true
validate :start_at_cannot_be_in_the_past

private
def start_at_cannot_be_in_the_past
  errors.add(:start_at, "can't be in the past") if start_at && start_at < Time.now
end