【问题标题】:Skipping email validation for Devise gem causes a uniqueness error跳过 Devise gem 的电子邮件验证会导致唯一性错误
【发布时间】:2018-11-10 09:48:39
【问题描述】:

在我的 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`

我不明白是什么导致了这个错误,因为我跳过了模型中存在性和唯一性的验证。提前感谢您的回答。

【问题讨论】:

    标签: ruby-on-rails validation devise


    【解决方案1】:

    您可能需要在数据库级别进行更改。

    Devise 在用户表上使用唯一索引。

    Devise 在其迁移中具有以下特点:

    add_index :users, :email, unique: true

    这会在您的db/schema.rb 中产生以下结果

    t.index ["email"], name: "index_users_on_email", unique: true

    您需要在迁移/模式中更改它并重置您的数据库。 `

    【讨论】:

    • 其实我不能drop数据库,因为生产服务器。有没有其他方法可以解决这个问题?
    • 您可以运行 SQL 查询来更改表并删除唯一性约束。看看这样的事情是否有帮助:stackoverflow.com/questions/5499574/…
    • 非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2021-08-22
    • 2014-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2014-04-03
    相关资源
    最近更新 更多