2

我有验证器,它验证表单上的一个字段。带类的字段返回值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

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

4

2 回答 2

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
于 2013-01-29T16:28:19.360 回答
1

在您的模型中,尝试

validates :field_name, :begins_at_not_in_past => true

如果你没有从你的验证器中指定一个可接受的返回值,模型可能不会认为它是一个失败的验证。

于 2013-01-29T16:35:39.593 回答