Ruby on Rails唯一性验证失败但仍创建记录

时间:2014-08-27 03:32:56

标签: ruby-on-rails ruby activerecord unique

我正在尝试为我的RoR项目中的记录要求唯一的电子邮件地址,我已经进行了以下验证:

validates :email, presence: { :message => "You must provide an email address." }, uniqueness: { :message => "This email is already taken." }
validates_uniqueness_of :email, :message=>"This email is already taken"

添加记录的表单旁边是最近添加的条目列表。当我尝试保存新记录时,它会将表单呈现为错误,但是如果查看列表,则会添加项目(具有重复的电子邮件地址)。如果刷新页面或更改表单中的电子邮件并重新提交,则条目将从列表中消失。我很好奇为什么即使验证正常启动,记录也会被保存。

我原以为可能是我用object.create(params)创建对象但是当我将其更改为object.build(params)时它没有任何效果。感谢所有帮助,谢谢!

2 个答案:

答案 0 :(得分:3)

这不是验证的问题,而是渲染该列表的方式。

如果您将对象添加到列表中,即使验证不成功,该元素也将完全像该列表中的所有其他元素一样呈现(因为它具有所有必需的值)。

您可以使用以下方法从列表中排除这些元素或以不同的方式处理它们 - 例如灰色:

record.valid?      # returns true if the record is valid
record.persisted?  # returns true if the record exists in the database (was save)

,而:

record.new_record? # returns true if the record wasn't saved into the database

顺便说一句:您在验证器定义中混合了新的和旧的哈希语法,并且唯一性验证器定义了两次。您可以将其更改为:

validates :email, presence:   { message: 'You must provide an email address.' },
                  uniqueness: { message: 'This email is already taken.' }

答案 1 :(得分:0)

create 方法创建一个对象并将其保存到数据库中;

构建方法(Alias for: new )赢了" t"创建"数据库中的记录,只需在内存中创建一个新对象。

验证用于确保只将有效数据保存到数据库中,在将记录发送到数据库之前运行验证。只有一些方法会触发验证。

  1. 创建
  2. 创建!
  3. 保存
  4. 保存!
  5. 更新
  6. 更新<!/ LI>