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 文档以了解有关如何使用它们的更多信息。
所以我有以下场景。我想创建一个新用户,但我希望它的电子邮件是唯一的。所以我有以下验证
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 文档以了解有关如何使用它们的更多信息。