Ruby on rails Rails 4.2 ActiveAdmin 1.0.0.pre2无法创建AdminUser,因为重复的键值违反了唯一约束;在电子邮件上索引\u管理员\u用户\u
嗨,我很难找出这个错误。昨天我发布了一条消息,说我的AcitveAdmin电子邮件字段总是空的。今天我意识到问题有点大 当我尝试在rails控制台中添加新用户时,会发生以下情况Ruby on rails Rails 4.2 ActiveAdmin 1.0.0.pre2无法创建AdminUser,因为重复的键值违反了唯一约束;在电子邮件上索引\u管理员\u用户\u,ruby-on-rails,postgresql,ruby-on-rails-4,activeadmin,Ruby On Rails,Postgresql,Ruby On Rails 4,Activeadmin,嗨,我很难找出这个错误。昨天我发布了一条消息,说我的AcitveAdmin电子邮件字段总是空的。今天我意识到问题有点大 当我尝试在rails控制台中添加新用户时,会发生以下情况 >> au = AdminUser.new(email: 'sample@tom.com', password: "123456789", password_confirmation: "123456789") => #<AdminUser id: nil, email: "", encrypte
>> au = AdminUser.new(email: 'sample@tom.com', password: "123456789", password_confirmation: "123456789")
=> #<AdminUser id: nil, email: "", encrypted_password: "$2a$10$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 ($1, $2, $3) RETURNING "id" [["encrypted_password","$2a$10$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 ($1, $2, $3) 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.
我还降级到ActiveAdmin 1.0.0.pre1,但问题仍然存在。Context
ActiveAdmin使用一个名为的东西来处理创建一个经过身份验证的用户模型(在AcitveAdmin的例子中命名为ActiveUser)。Desive非常好,因为它处理添加和验证所有基本身份验证字段,如电子邮件、密码、密码确认等
OP问题
OP存在添加一个attr\u accessor:email
的问题,该问题覆盖了designe email字段:(
这意味着每次创建用户时,电子邮件总是设置为“
”
但是由于系统的复杂性,ActiveRecord验证查看了正确的电子邮件字段,并说它很好。但是,在保存时,发送了空的“
电子邮件(这仍然是一个字符串,因此不会使not null
约束无效。因此,创建了一个带有空电子邮件的ActiveUser。然后,下次创建ActiveUser时,抛出了一个重复的
错误(因为插入了另一个电子邮件为”
的用户)
如果你有这个问题怎么办
确保电子邮件字段中没有访问者(或密码/密码确认)。如果您需要做一些有趣的事情,请阅读设计指南。ActiveUser的结果是什么。控制台中的所有?insert语句没有为电子邮件插入值…因此,如果其中有一个用户的电子邮件地址为空,这就是为什么首先会出现重复错误而不是非空冲突错误的原因。您还可以发布您正在使用的ActiveAdmin版本吗?确实有一个用户的电子邮件地址为空。我销毁了这个。现在我可以保存一个新的adminuser,但电子邮件地址显示为
电子邮件:“”
当我使用AdminUser.all时。我将用整个输出更新问题,我直接使用Github的ActiveAdmin1.0.0.pre2。您对AdminUser模型有任何自定义验证吗?如果您添加了答案,我可以接受,如果您愿意的话
>> au = AdminUser.new(email: 'sample@tom.com', password: "123456789", password_confirmation: "123456789")
=> #<AdminUser id: nil, email: "", encrypted_password: "$2a$10$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 ($1, $2, $3) RETURNING "id"
[["encrypted_password",
"$2a$10$TWpMSdAxPl4vTFg54XvZcOe5Xkc7t4mf2Or7UlbkoA8W/n3rOGGwC"],
["created_at", "2015-10-21 14:28:46.750437"], ["updated_at","2015-10-2114:28:46.750437"]]
(18.0ms) COMMIT
=> true