Rails设计无法注册第二个用户

时间:2016-05-09 07:05:56

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

我正在使用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,因为它已经存在(在第一个用户中)。

在我的应用程序中,实际上并不需要重置密码,因为我可以做到这一切并且只有几个人。

我能够:

  1. 让应用编写实际独特的重置令牌
  2. 绕过它

2 个答案:

答案 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

我希望它对您有用。