我想中断我的 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创建记录后,您将无法在以后再次添加唯一索引,因为创建唯一索引将失败