【问题标题】:How can I save a reset_password_token at the time I create a new Devise user?创建新的设计用户时如何保存 reset_password_token?
【发布时间】:2015-09-03 19:51:19
【问题描述】:

当我尝试创建新的 Devise 用户时,出现错误:

ActiveRecord::RecordNotUnique: TinyTds::Error: 无法插入重复 具有唯一索引的对象“dbo.admin_users”中的关键行 'index_admin_users_on_reset_password_token'。重复键值 是(空)

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

当我尝试在该字段中手动提交一个值时,它会被自动省略。

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

ActiveRecord::RecordNotUnique: TinyTds::Error: 无法插入重复 具有唯一索引的对象“dbo.admin_users”中的关键行 'index_admin_users_on_reset_password_token'。重复键值 是 ().: EXEC sp_executesql N'INSERT INTO [admin_users] ([email], [encrypted_pa​​ssword], [created_at], [updated_at]) 输出插入。[id] 值 (@0, @1, @2, @3)', N'@0 nvarchar(4000), @1 nvarchar(4000), @2 日期时间,@3 日期时间',@0 = N'integracore@example.com',@1 = N'$2a$10$cm9AmPuwEey4hDFMUPMMkeD3bLPozT47VLdmg9kDlDRKBXh93Hn0C', @2 = '09-03-2015 19:45:11.555', @3 = '09-03-2015 19:45:11.555'

我怎样才能克服这个错误并创建一个新用户?

【问题讨论】:

    标签: ruby-on-rails ruby sql-server devise


    【解决方案1】:

    所以我暂时添加了这个解决方法。我基本上只是在创建新用户之前和之后更新所有 NULL 记录。我更愿意以“设计方式”来做,所以如果有人发帖我会选择它作为答案,但这暂时可行:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-26
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-30
      • 2017-07-29
      • 1970-01-01
      相关资源
      最近更新 更多