跳过 Devise gem 的电子邮件验证会导致唯一性错误
Skipping email validation for Devise gem causes a uniqueness error
在我的 Rails 应用程序中,我使用 Devise gem 来验证用户。如果我从管理面板创建用户,我需要跳过电子邮件验证。到目前为止我有这个代码:
# User model
class User < ApplicationRecord
attr_accessor :skip_email_validation
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable
validates :email, presence: true, uniqueness: true, unless: :skip_email_validation
end
#User's controller create action
class Admin::UsersController < Admin::AdminController
def create
@user = User.new(user_params)
@user.skip_email_validation = true
if @user.save
redirect_to admin_user_path(@user), success: 'User created.'
else
render :new
end
end
end
因此,当我创建第一个没有电子邮件的用户时,它被保存到数据库中,但是当我创建另一个没有电子邮件的用户时,出现错误:
Mysql2::Error: Duplicate entry '' for key 'index_users_on_email': INSERT INTO `users`
我不明白是什么导致了这个错误,因为我跳过了模型中存在性和唯一性的验证。提前感谢您的回答。
您可能需要在数据库级别进行更改。
设计对用户使用唯一索引 table。
Devise 在其迁移中有以下内容:
add_index :users, :email, unique: true
这会在您的 db/schema.rb
中产生以下结果
t.index ["email"], name: "index_users_on_email", unique: true
您需要在 migrations/schema 中更改它并重置您的数据库。
`
在我的 Rails 应用程序中,我使用 Devise gem 来验证用户。如果我从管理面板创建用户,我需要跳过电子邮件验证。到目前为止我有这个代码:
# User model
class User < ApplicationRecord
attr_accessor :skip_email_validation
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable
validates :email, presence: true, uniqueness: true, unless: :skip_email_validation
end
#User's controller create action
class Admin::UsersController < Admin::AdminController
def create
@user = User.new(user_params)
@user.skip_email_validation = true
if @user.save
redirect_to admin_user_path(@user), success: 'User created.'
else
render :new
end
end
end
因此,当我创建第一个没有电子邮件的用户时,它被保存到数据库中,但是当我创建另一个没有电子邮件的用户时,出现错误:
Mysql2::Error: Duplicate entry '' for key 'index_users_on_email': INSERT INTO `users`
我不明白是什么导致了这个错误,因为我跳过了模型中存在性和唯一性的验证。提前感谢您的回答。
您可能需要在数据库级别进行更改。
设计对用户使用唯一索引 table。
Devise 在其迁移中有以下内容:
add_index :users, :email, unique: true
这会在您的 db/schema.rb
t.index ["email"], name: "index_users_on_email", unique: true
您需要在 migrations/schema 中更改它并重置您的数据库。 `