【问题标题】:Rails validations on create and update methodsRails 对创建和更新方法的验证
【发布时间】:2021-12-07 03:42:28
【问题描述】:

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


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

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

谢谢你:D

【问题讨论】:

标签: ruby-on-rails postgresql validation


【解决方案1】:

您的方案的最佳解决方案是使用validates_uniqueness_of 或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 文档以了解有关如何使用它们的更多信息。

【讨论】:

  • 这是正确的,就验证而言。我只想补充一点,还应该在数据库中为电子邮件添加一个唯一索引,以进行实际保护。此验证对于获取错误消息很有用,但它不保证唯一性。
  • 是的,当然,这应该被唯一性约束加倍。会更新。
  • @SergioTulentsev 完成。
猜你喜欢
  • 2019-01-20
  • 2010-11-26
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2018-07-17
  • 2018-04-09
  • 1970-01-01
相关资源
最近更新 更多