Rails对创建和更新方法的验证



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


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

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

Thank you:D

您的场景的最佳解决方案是使用validates_uniqueness_of或唯一性,因为它确保了电子邮件在应用程序级别的唯一性。

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

为了使唯一性防弹,应该在数据库中添加email的唯一索引。如果由于某种原因,您绕过了模型中的验证,那么DB将抛出一个错误。

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

你应该浏览一下Validation Docs文档,了解更多关于如何使用它们的信息。