如何在创建新的Devise用户时保存reset_password_token?

时间:2015-09-03 19:51:19

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

当我尝试创建一个新的Devise用户时,我收到错误:

  

ActiveRecord :: RecordNotUnique:TinyTds ::错误:无法插入重复项   对象中的关键行' dbo.admin_users'具有独特的索引   ' index_admin_users_on_reset_password_token&#39 ;.重复键值   是(NULL)

这是因为索引' 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 ::错误:无法插入重复项   对象中的关键行&#39; dbo.admin_users&#39;具有独特的索引   &#39; index_admin_users_on_reset_password_token&#39 ;.重复键值   是():EXEC sp_executesql N&#39; INSERT INTO [admin_users]([email],   [encrypted_pa​​ssword],[created_at],[updated_at])OUTPUT INSERTED。[id]   VALUES(@ 0,@ 1,@ 2,@ 3)&#39;,N&#39; @ 0 nvarchar(4000),@ 1 nvarchar(4000),@ 2   datetime,@ 3 datetime&#39;,@ 0 = N&#39; integracore@example.com',@ 1 =   N&#39; $ 2a $ 10 $ cm9AmPuwEey4hDFMUPMMkeD3bLPozT47VLdmg9kDlDRKBXh93Hn0C&#39;,@ 2 =   &#39; 09-03-2015 19:45:11.555&#39;,@ 3 =&#39; 09-03-2015 19:45:11.555&#39;

如何解决此错误并创建新用户?

1 个答案:

答案 0 :(得分:0)

所以我暂时添加了这个解决方法。我基本上只是在创建新用户之前和之后更新所有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