Ruby on rails 如何在创建新的设备用户时保存重置密码令牌?

Ruby on rails 如何在创建新的设备用户时保存重置密码令牌?,ruby-on-rails,ruby,sql-server,devise,Ruby On Rails,Ruby,Sql Server,Devise,当我尝试创建一个新的Desive用户时,会出现以下错误: ActiveRecord::RecordNotUnique:TinyTds::错误:无法插入重复项 对象“dbo.admin_users”中具有唯一索引的键行 '索引\管理员\用户\重置\密码\令牌'。重复的键值 是(空) 这是因为索引“index_admin_users_on_reset_password_token”在reset_password_token字段中需要唯一的值,并且每个创建的用户在该字段中都会提交一个nil值,这意味着

当我尝试创建一个新的Desive用户时,会出现以下错误:

ActiveRecord::RecordNotUnique:TinyTds::错误:无法插入重复项 对象“dbo.admin_users”中具有唯一索引的键行 '索引\管理员\用户\重置\密码\令牌'。重复的键值 是(空)

这是因为索引“index_admin_users_on_reset_password_token”在reset_password_token字段中需要唯一的值,并且每个创建的用户在该字段中都会提交一个
nil
值,这意味着超过第一个的每个记录都不是唯一的

当我尝试手动提交该字段中的值时,它将自动被ommitted

user = AdminUser.new(email: "integracore@example.com", password: "integracore", reset_password_token:"french fries", reset_password_sent_at: Time.now)
#<AdminUser:0x000000075303e8
# id: nil,
# email: "integracore@example.com",
# encrypted_password: "$2a$10$cm9AmPuwEey4hDFMUPMMkeD3bLPozT47VLdmg9kDlDRKBXh93Hn0C",
# reset_password_token: "french fries",
# reset_password_sent_at: Thu, 03 Sep 2015 19:42:25 UTC +00:00,
# remember_created_at: nil,
# sign_in_count: 0,
# current_sign_in_at: nil,
# last_sign_in_at: nil,
# current_sign_in_ip: nil,
# last_sign_in_ip: nil,
# created_at: nil,
# updated_at: nil>
user.save
user=AdminUser.new(电子邮件:integracore@example.com,密码:“integracore”,重置密码令牌:“炸薯条”,重置密码发送时间:Time.now)
#
user.save
ActiveRecord::RecordNotUnique:TinyTds::错误:无法插入重复项 对象“dbo.admin_users”中具有唯一索引的键行 '索引\管理员\用户\重置\密码\令牌'。重复的键值 is():EXEC sp_executesql N'插入[管理员用户]([电子邮件], 插入[加密密码]、[创建密码]、[更新密码])输出。[id] 数值(@0,@1,@2,@3)'、N'@0 nvarchar(4000)、@1 nvarchar(4000)、@2 datetime,@3 datetime',@0=N'integracore@example.com', @1 = N'$2a$10$cm9ampuweey4hdfmummked3blpozt47vldmg9kdldrkbxh93hn0c',@2= '09-03-2015 19:45:11.555',@3='09-03-2015 19:45:11.555'


如何克服此错误并创建新用户?

因此,我暂时添加了此解决方法。我基本上只是在创建新用户之前和之后更新所有空记录。我更愿意采用“设计方法”,因此如果有人发帖,我会选择这个作为答案,但这将暂时奏效:

class AdminUser < ActiveRecord::Base
  devise :database_authenticatable, 
         :recoverable, :rememberable, :trackable, :validatable

  # Create new user #############################################################
    def self.add_user (email:,password:"password")
      clean_empty_reset_tokens
      user = self.create(email:email,password:password)
      user.set_reset_token
      return user
    end

    def set_reset_token token = self.class.generate_token
      update(reset_password_token: token)
      return token
    end

    def self.clean_empty_reset_tokens
      where(reset_password_token:nil).each do |user|
        user.update(reset_password_token:generate_token)
      end
    end

    def self.generate_token
        raw_token, hashed_token = Devise.token_generator.generate(self, :reset_password_token)
        return hashed_token
    end
  # End create new user #########################################################
end
class AdminUser