Ruby On Rails 设计:如何在注册和重写期间避免电子邮件唯一性验证,以仅在具有角色"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创建记录后,您将无法在以后再次添加唯一索引,因为创建唯一索引将失败

相关内容

  • 没有找到相关文章

最新更新