当我尝试创建一个新的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_password],[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;
如何解决此错误并创建新用户?
答案 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