创建自定义验证器

时间:2013-01-29 16:18:09

标签: ruby-on-rails ruby

我有验证器,验证表单上的一个字段。类ActiveSupport::TimeWithZone

的字段返回值
validate :begins_at_not_in_past

def begins_at_not_in_past
    return unless self.state == 'Scheduled'
    if self.begins_at != nil && self.begins_at < (Time.now - 1.hour)
       errors.add(:begins_at, 'Action cannot begin in past')
      false
    end

end

如果验证失败,它会向我显示我的错误,但即使表格中的数据无效,它也会在数据库中创建新记录。 我哪里弄错了?

2 个答案:

答案 0 :(得分:4)

你应该有以下行。否则它不会向对象添加错误。所以在errors.add

中添加以下行
validate :begins_at_not_in_past

def begins_at_not_in_past
  return unless self.state == 'Scheduled'
  if self.begins_at != nil && self.begins_at < (Time.now - 1.hour)
    errors.add(:begins_at, 'Action cannot begin in past')
    errors[:base] << 'Correct errors'  # Rails 2.3.X errors.add_to_base('msg')
    false
  end
end

在控制器中:#Validation仅在您调用有效时运行?方法

if obj.valid?
  #do something
else
  flash[:error] = obj.errors.full_messages.join('<br/>')
end

答案 1 :(得分:1)

在您的模型中,尝试

validates :field_name, :begins_at_not_in_past => true

如果您未从验证程序指定可接受的返回值,则模型可能不会将其视为验证失败。