2015-10-21 3 views
0

Привет, мне трудно найти эту ошибку. Вчера я опубликовал question, что мое поле электронной почты AcitveAdmin всегда пустое .Сегодний я понял, что проблема немного больше.Rails 4.2 ActiveAdmin 1.0.0.pre2 Невозможно создать AdminUser из-за дублирования значения ключа, нарушает уникальное ограничение «index_admin_users_on_email

Когда я пытаюсь добавить новый пользователь в рельсах консоль происходит следующее.

>> au = AdminUser.new(email: '[email protected]', 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" = '[email protected]' LIMIT 1 
=> true 

>> au.save 
(0.8ms) BEGIN 
AdminUser Exists (1.1ms) SELECT 1 AS one FROM "admin_users" WHERE "admin_users"."email" = '[email protected]' 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. 

Но я никогда не использовал это письмо. Я недавно распределял свою базу данных Итак, теперь в продуктивной среде я использую другую базу данных. Но для развития каждый ng остался прежним. Один AdminUser в таблице admin_users по-прежнему доступен, и я могу войти в него с помощью панели управления ActiveAdmin.

У меня проблема similar, но решения для меня не работают. Есть ли у кого-нибудь предложения? Спасибо всем заблаговременно!

Update

Оказалось, там был adminuser с нулевым адресом. Вот почему я получил поле электронной почты для публикации. Я уничтожил этого пользователя. Теперь я могу добавить другого администратора. Но поле электронной почты все еще не написано.

>> au = AdminUser.new(email: '[email protected]', 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" = '[email protected]' LIMIT 1 
=> true 

>> au.save 
(0.7ms) BEGIN 
AdminUser Exists (0.8ms) SELECT 1 AS one FROM "admin_users" WHERE "admin_users"."email" = '[email protected]' 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 

Я также понизил до ActiveAdmin 1.0.0.pre1, но проблема все еще существует.

+0

Каковы результаты 'ActiveUser.all' в консоли? Оператор insert isn ' t вставляя значение для электронной почты ... Поэтому, если есть пользователь, который имеет какой-то NULL-адрес электронной почты, поэтому вы сначала получаете дублируемую ошибку вместо ошибки NULL-нарушения. lso можете ли вы опубликовать какую версию ActiveAdmin вы используете? – wspurgin

+0

На самом деле был пользователь с нулевым адресом электронной почты. Я уничтожил этот. Теперь я могу сохранить нового администратора, но и там адрес электронной почты отображается как «email:» «когда я использую AdminUser.all. Я буду обновлять вопрос с помощью всего вывода – theDrifter

+0

И я использую ActiveAdmin1.0.0.pre2 непосредственно из github – theDrifter

ответ

2

Контекст

ActiveAdmin использует то, что называется Devise, который обрабатывает создание аутентификацией модели пользователя (с именем ActiveUser в случае AcitveAdmin в). Разрабатывает очень приятно, потому что она обрабатывает добавление и проверки всех основные полей аутентификации, такие как электронная почта, пароль, password_confirmation и т.д.

проблема OP

ОП был вопрос о добавлении attr_accessor :email, который переписал электронное поле DEViSE: ( Это означает, что каждый раз, когда пользователь был создан по электронной почте всегда был установлен в "".

Но из-за сложности системы, проверка ActiveRecord посмотрел на нужное поле электронной почты и сказал, что это хорошо. Однако , при сохранении, пустой "" отправлено письмо (которое по-прежнему является строкой, поэтому не отменяет ограничение not null. Таким образом был создан ActiveUser с пустым электронным письмом. Тогда в следующий раз была создана ActiveUser, был брошена ошибка duplicate (потому что другой пользователь с эл.адресом "" был вставлен.

Что делать, если у вас есть эта проблема

Убедитесь, что у вас нет (или пароль/пароль_подтверждение, если на то пошло). И прочитайте руководства по разработке, если вам нужно что-то сделать.

Смежные вопросы