代码之家  ›  专栏  ›  技术社区  ›  Alex Zakruzhetskyi

跳过devise gem的电子邮件验证会导致唯一性错误

  •  1
  • Alex Zakruzhetskyi  · 技术社区  · 8 年前

    在我的rails应用程序中,我使用deviegem来验证用户。如果我从管理面板创建用户,则需要跳过电子邮件验证。到目前为止,我有这个代码:

    # 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`
    

    我不明白是什么导致了这个错误,因为我忽略了模型中存在性和唯一性的验证。谢谢你的回答。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Kartikey Tanna    8 年前

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

    设计使用用户表上的唯一索引。

    设计在其迁移过程中有以下几点:

    add_index :users, :email, unique: true

    结果在您的 db/schema.rb

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

    您需要在migrations/schema中更改它并重置数据库。 '