我正在使用Rails和Devise,它正在连接到数据库的MS SQL Server。这一切都很好,工作正常。
当我尝试注册第二个人时,我收到以下错误:
ActiveRecord::RecordNotUnique in Devise::RegistrationsController#create
TinyTds::Error: Cannot insert duplicate key row in object 'dbo.users' with
unique index 'index_users_on_reset_password_token'. The duplicate key value
is (<NULL>).: EXEC sp_executesql N'INSERT INTO [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'ben_mcmaster@outlook.com', @1 =
N'$2a$10$TK79.NSrjZaT93TiQphqB.M6XfBUlaGFmAqJUGgssdGggR4OB.7oC', @2 = '05-
09-2016 06:40:34.448', @3 = '05-09-2016 06:40:34.448'
我主要看的是它正在尝试创建一个新的重置密码令牌,但它试图将其设为NULL,因为它已经存在(在第一个用户中)。
在我的应用程序中,实际上并不需要重置密码,因为我可以做到这一切并且只有几个人。
我能够:
答案 0 :(得分:1)
根据我的理解,您可以在应用程序中没有完整的“忘记密码”功能。 如this question中所述,您需要删除设计模型中的:recoverable选项,我认为这应该可以解决您的问题。
答案 1 :(得分:0)
我认为问题是SQL Server。
一方面,默认情况下,Devise在user.reset_password_token上添加唯一索引。这允许用户使用带有一次令牌的重置密码链接来重置其密码。重置密码后,“ reset_password_token”字段将重置为空。
另一方面,标准表示UNIQUE约束应禁止重复的非NULL值,但允许多个NULL值。而且,SQL Server始终会对此进行简化,允许使用单个NULL,但不允许使用多个NULL值。
总而言之,如果我是您,我将以这种方式重新启动迁移:
https://gist.github.com/andyhull/8045794202fd52930f93
我希望它对您有用。