Rails 4.2 ActiveAdmin 1.0.0.pre2 由于重复键值违反唯一约束而无法创建 AdminUser“index_admin_users_on_email

Rails 4.2 ActiveAdmin 1.0.0.pre2 Cannot create a AdminUser due to duplicate key value violates unique constraint "index_admin_users_on_email

您好,我很难找出这个错误。昨天我发布了一个 ,我的 AcitveAdmin 电子邮件字段总是 empty.Today 我意识到问题有点大。

当我尝试在 rails 控制台中添加新用户时,会发生以下情况。

>> au = AdminUser.new(email: 'sample@tom.com', password: "123456789", password_confirmation: "123456789")
=> #<AdminUser id: nil, email: "", encrypted_password: "a$Xt6EpJhtQ3d1v62KNZFUk.oi1RYe2gEBBeWVd/vApvi...",reset_password_token: nil, reset_password_sent_at: nil, 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>

>> au.valid?
AdminUser Exists (0.8ms)  SELECT  1 AS one FROM "admin_users" WHERE"admin_users"."email" = 'sample@tom.com' LIMIT 1
=> true

>> au.save
(0.8ms)  BEGIN
AdminUser Exists (1.1ms)  SELECT  1 AS one FROM "admin_users" WHERE "admin_users"."email" = 'sample@tom.com' LIMIT 1
SQL (3.5ms)  INSERT INTO "admin_users" ("encrypted_password","created_at", "updated_at") VALUES (, , ) RETURNING "id"  [["encrypted_password","a$Xt6EpJhtQ3d1v62KNZFUk.oi1RYe2gEBBeWVd/vApviETIlUvpQ2q"], 
["created_at", "2015-10-21 13:57:44.081780"],["updated_at", "2015-10-21 13:57:44.081780"]]
PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_admin_users_on_email"
DETAIL:  Key (email)=() already exists.
: INSERT INTO "admin_users" ("encrypted_password", "created_at","updated_at") VALUES (, , ) RETURNING "id"
(1.2ms)  ROLLBACK
ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_admin_users_on_email"DETAIL:  Key (email)=() already exists.

但是我从来没有用过这个邮箱。我最近对我的数据库系统进行了分区。所以现在在生产环境中我使用不同的数据库。但对于发展,一切都保持不变。 admin_users table 中的一个 AdminUser 仍然可以访问,我可以通过 ActiveAdmin 仪表板使用这个登录。

我在这里发现了一个 similar 问题,但解决方案对我不起作用。 有人有什么建议吗?在此先感谢大家!

更新

原来有一个空地址的adminuser。所以这就是为什么我得到了重复的电子邮件字段。我毁了那个用户。现在我可以添加另一个管理员用户了。但是email字段还是没有写。

>> au = AdminUser.new(email: 'sample@tom.com', password: "123456789", password_confirmation: "123456789")
=> #<AdminUser id: nil, email: "", encrypted_password: "a$TWpMSdAxPl4vTFg54XvZcOe5Xkc7t4mf2Or7UlbkoA8...", reset_password_token: nil, reset_password_sent_at: nil, 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>

>> au.valid?
AdminUser Exists (25.6ms)  SELECT  1 AS one FROM "admin_users" WHERE "admin_users"."email" = 'sample@tom.com' LIMIT 1
=> true

>> au.save
(0.7ms)  BEGIN
 AdminUser Exists (0.8ms)  SELECT  1 AS one FROM "admin_users" WHERE "admin_users"."email" = 'sample@tom.com' LIMIT 1
 SQL (61.7ms)  INSERT INTO "admin_users" ("encrypted_password",
  "created_at", "updated_at") VALUES (, , ) RETURNING "id"   
  [["encrypted_password", 
  "a$TWpMSdAxPl4vTFg54XvZcOe5Xkc7t4mf2Or7UlbkoA8W/n3rOGGwC"], 
  ["created_at", "2015-10-21 14:28:46.750437"], ["updated_at","2015-10-2114:28:46.750437"]]
   (18.0ms)  COMMIT
 => true

我也降级到 ActiveAdmin 1.0.0.pre1,但问题仍然存在。

上下文

ActiveAdmin 使用名为 Devise 的东西处理创建经过身份验证的用户模型(在 AcitveAdmin 的情况下名为 ActiveUser)。 Devise 非常好,因为它处理添加和验证所有基本身份验证字段,如电子邮件、密码、password_confirmation 等

OP问题

OP 在添加覆盖 Devise 电子邮件字段的 attr_accessor :email 时遇到了问题 :( 这意味着每次创建用户时,电子邮件总是设置为 "".

但是由于系统的复杂性,ActiveRecord验证看了正确的email字段,说不错。但是,在保存时,发送了空的 "" 电子邮件(它仍然是一个字符串,因此不会使 not null 约束无效。因此创建了一个带有空电子邮件的 ActiveUser。然后下一次 ActiveUser创建时,抛出了 duplicate 错误(因为插入了另一个电子邮件地址为 "" 的用户。

遇到这个问题怎么办

确保您在电子邮件字段上没有访问者(或 password/password_confirmation 就此而言)。如果您需要做一些花哨的事情,请阅读设计指南。