Ruby on rails RubyonRails唯一性验证失败,但仍创建记录

Ruby on rails RubyonRails唯一性验证失败,但仍创建记录,ruby-on-rails,ruby,activerecord,unique,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

我正试图为我的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)
时,它没有任何效果。感谢您的帮助,谢谢

这不是验证的问题,而是呈现列表的方式的问题

如果将对象添加到列表中,即使验证未成功,该元素也将与该列表中的所有其他元素完全相同(因为它具有所有必需值)

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

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.' }

这不是验证的问题,而是呈现列表的方式的问题

如果将对象添加到列表中,即使验证未成功,该元素也将与该列表中的所有其他元素完全相同(因为它具有所有必需值)

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

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.' }

这不是验证的问题,而是呈现列表的方式的问题

如果将对象添加到列表中,即使验证未成功,该元素也将与该列表中的所有其他元素完全相同(因为它具有所有必需值)

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

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.' }

这不是验证的问题,而是呈现列表的方式的问题

如果将对象添加到列表中,即使验证未成功,该元素也将与该列表中的所有其他元素完全相同(因为它具有所有必需值)

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

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.' }

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

build方法(别名:new)不会在数据库中“创建”记录,只会在内存中创建一个新对象

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

  • 创造
  • 创造
  • 拯救
  • 救命
  • 更新
  • 更新
    create方法创建一个对象并将其保存到数据库中

    build方法(别名:new)不会在数据库中“创建”记录,只会在内存中创建一个新对象

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

  • 创造
  • 创造
  • 拯救
  • 救命
  • 更新
  • 更新
    create方法创建一个对象并将其保存到数据库中

    build方法(别名:new)不会在数据库中“创建”记录,只会在内存中创建一个新对象

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

  • 创造
  • 创造
  • 拯救
  • 救命
  • 更新
  • 更新
    create方法创建一个对象并将其保存到数据库中

    build方法(别名:new)不会在数据库中“创建”记录,只会在内存中创建一个新对象

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

  • 创造
  • 创造
  • 拯救
  • 救命
  • 更新
  • 更新
    谢谢你的详细回复。我只是不完全清楚如何使用这些方法排除记录。是否有方法将这些方法合并到
    。where()
    ?@apardes:是否要在该列表中显示未保存的记录(可能以不同的样式)?还是应该将这些记录从列表中排除?此外:请张贴您的控制器和查看代码。我可以根据您的需要告诉您需要更改什么。谢谢您的详细回复。我只是不完全清楚如何使用这些方法排除记录。有没有一种方法可以合并这些