Rails 创建和更新方法验证

Rails validations on create and update methods

所以我有以下场景。我想创建一个新用户,但我希望它的电子邮件是唯一的。所以我有以下验证


  def uniq_email
    errors.add(:email, "Already existing User with email: #{email}") if
      User.exists?(email: email)
  end

这很好用。问题是当我想更新这个用户时,如果我尝试用一​​个已经存在的电子邮件更改电子邮件,它允许我这样做。 我尝试在验证中添加 [:create, :update] 但如果我这样做,当我更改它的地址时,它会再次运行模型验证并告诉我该电子邮件的用户已经存在。 有什么帮助吗?我怎样才能避免这种情况?

谢谢 :D

适合您的情况的最佳解决方案是使用 validates_uniqueness_of or uniqueness,因为它可确保电子邮件在应用程序级别的唯一性。

class User < ActiveRecord::Base
  validates_uniqueness_of :email
  # or
  validates :email, uniqueness: true
end

为了保证唯一性,应该在数据库中添加电子邮件的唯一索引。如果出于某种原因绕过模型中的验证,数据库将引发错误。

class MakeEmailUnique < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

您应该查看 Validation Docs 文档以了解有关如何使用它们的更多信息。