繁体   English   中英

Ruby On Rails Devise:如何在注册和重写期间避免电子邮件唯一性验证,仅当角色为“ X”时检查它是否唯一

[英]Ruby On Rails Devise: How can I avoid email uniqueness validation during sign up and rewrite to check if it's unique only if has role “X”

我想中断我的Rails应用程序中的默认注册操作,更改电子邮件验证。 我需要的是仅在该用户已经注册并且角色为'X'情况下,使电子邮件字段唯一。

我尝试了以下操作,但是我的应用程序返回"Email has already been taken"消息:

验证:

validates_uniqueness_of :email, {allow_blank: true, if: :already_exists_as_x?}

def already_exists_as_x?
  User.where(email: self.email, role: :X).exists?
end

(我将很高兴为您提供帮助)

假设模型包括Devise的:validatable模块,则可以从模型中删除此模块,并根据需要编写自己的验证。

在您的模型中(例如user.rb),您的设计调用包含:validatable,例如:

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :validatable, :confirmable, :trackable

从此调用中删除或评论:validatable,然后您自己的验证应会按预期工作。

如果您使用的是Rails 5,则需要在用户模型中覆盖以下方法

  def will_save_change_to_email?
    if User.where(email: self.email, role: :X).exists?
      return true
    else
      return false
    end
  end

当您返回true ,devise将继续进行uniqueness检查;当您返回false devise将不检查唯一性

您还需要删除unique index因为仅通过设计验证就无法保存用户

  def change
    remove_index :users, :name => :index_users_on_email
  end

注意:删除索引并创建具有重复电子邮件ID的记录后,您将无法再重新添加唯一索引,因为创建唯一索引将会失败

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM