2015-09-03 27 views
0

當我嘗試創建一個新設計的用戶,我得到的錯誤:如何在創建新Devise用戶時保存reset_password_token?

ActiveRecord::RecordNotUnique: TinyTds::Error: Cannot insert duplicate key row in object 'dbo.admin_users' with unique index 'index_admin_users_on_reset_password_token'. The duplicate key value is (NULL)

這是因爲索引「index_admin_users_on_reset_password_token」需要在reset_password_token領域獨特的價值觀,以及每一個被創建的用戶與提交nil該字段中的值,這意味着每一個記錄都不會是唯一的。

當我嘗試手動提交該字段中的值時,它會自動省略。

user = AdminUser.new(email: "[email protected]", password: "integracore", reset_password_token:"french fries", reset_password_sent_at: Time.now) 
#<AdminUser:0x000000075303e8 
# id: nil, 
# email: "[email protected]", 
# 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: Cannot insert duplicate key row in object 'dbo.admin_users' with unique index 'index_admin_users_on_reset_password_token'. The duplicate key value is().: EXEC sp_executesql N'INSERT INTO [admin_users] ([email], [encrypted_password], [created_at], [updated_at]) OUTPUT INSERTED.[id] VALUES (@0, @1, @2, @3)', N'@0 nvarchar(4000), @1 nvarchar(4000), @2 datetime, @3 datetime', @0 = N'[email protected]', @1 = N'$2a$10$cm9AmPuwEey4hDFMUPMMkeD3bLPozT47VLdmg9kDlDRKBXh93Hn0C', @2 = '09-03-2015 19:45:11.555', @3 = '09-03-2015 19:45:11.555'

我怎樣才能突破這個錯誤,並創建一個新的用戶?

回答

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 
相關問題