我有验证器,验证表单上的一个字段。类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
如果验证失败,它会向我显示我的错误,但即使表格中的数据无效,它也会在数据库中创建新记录。 我哪里弄错了?
答案 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
如果您未从验证程序指定可接受的返回值,则模型可能不会将其视为验证失败。