PG :: UniqueViolation: ERROR: дублирующее значение ключа нарушает уникальное ограничение

Я использую devise (4.2.0) в рельсах (4.2.6).

В моем приложении я использую вложенные атрибуты в таблице пользователя и профиля. Мне нужно проверить пароль, только если я создаю новую запись, поле пароля не проверяется при обновлении созданных записей.

Мой файл user.rb :

class User < ActiveRecord::Base
 has_one :profile
 has_one :company_profile
 accepts_nested_attributes_for :profile
 attr_accessor :profile_updation


 devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable

 validates_presence_of :email, if: :email_required?


 validates_presence_of :password, if: :password_required?
 validates_confirmation_of :password, if: :password_required?

 protected

 def email_required?
   true && profile_updation.blank?
 end

 def password_required?
   !password.nil? || !password_confirmation.nil?

 end

end

Когда я запускаю свое приложение, эта ошибка произошла:

create_table "пользователи" , сила : : каскадный сделать | t | 
   т . строка    "email" , по                   умолчанию : "" , null : false 
   t . string    "encrypted_password" , по      умолчанию : "" , null : false 
   t . строка    "reset_password_token" 
   t . datetime "reset_password_sent_at" 
   t . Дата и время      "remember_created_at" 
   t . integer   "sign_in_count" , по           умолчанию : 0 ,   null : false 
   t . datetime "current_sign_in_at" 
   t . datetime "last_sign_in_at" 
   t . inet      "current_sign_in_ip" 
   t . inet      "last_sign_in_ip" 
   t . datetime "created_at" ,                           null : false 
   t . datetime "updated_at" ,                           null : false 
   t . string    "first_name" 
   t . string    "last_name" 
   t . строка    "user_id" end    
 

 add_index "пользователи" , [ "электронная почта" ], имя : "index_users_on_email" , уникальная : правда , с помощью : : ВТКЕЕ    
 add_index "пользователи" , [ "reset_password_token" ], название : "index_users_on_reset_password_token" , уникальная : правда , с помощью : : ВТКЕЕ            
 add_index "профили" , [ "user_id" ], название : "index_profiles_on_user_id" , используя : : ВТКЕЕ   

create_table "профили" , сила : : каскадный сделать | t | 
   т . string    "company_name" 
   t . целая   «страна» 
   t . целое   «состояние» 
   t . целочисленный   «бизнес» 
   t . строка    "mobile_no" 
   t . datetime "created_at" ,        null : false 
   t . datetime "updated_at" ,        null : false 
   t . integer   "user_id" 
   t . boolean   "terms_conditions" end "index_users_on_email" DETAIL: Key (email) = () уже существует. : INSERT INTO «пользователи» («first_name», «last_name», «user_id», «created_at», «updated_at») VALUES ($ 1, $ 2, $ 3, $ 4, $ 5) RETURNING «id» prettyprint prettyprinted »>    
 rake db:drop
rake db:create
rake db:migrate

Я искал эту проблему, но я не могу ее решить.

Таблица пользователя и профиля в файле схемы

#one: {}
#two: {}

ruby-on-rails,devise,

4

Ответов: 4


7 принят

Я тоже столкнулся с той же проблемой, сбросьте базу данных и заново создайте ее.

class User < ActiveRecord::Base
  validates :email, :uniqueness => {:allow_blank => true}
end

надеюсь, что это сработает


13

Взгляните на свой файл test / fixtures / one.yml и закомментируйте любые пустые светильники. См. Пример ниже:

two

2

Вы вставляете пользователя без db / schema.rb, и у вас его уже есть. Если вы хотите игнорировать пробелы при повторной проверке, измените свой валидатор:

email

0

После того, как вы выполнили все шаги настройки Devise, пользователи верны:

  1. В приборах для тестирования модели пользователя есть два пользователя oneи two. Эти пользователи пустые. У них нет значений для любых атрибутов.
  2. В вашем файле есть ограничение уникальности для emailстолбца usersтаблицы. Это приведет к тому, что ваша база данных вызовет ошибку, если пользователь с электронной почтой, уже содержащейся в существующем пользователе, должен быть сохранен.

Это означает, что если вы не делаете записи приборов различными, выбирая разные письма для каждого или удаляя один из них, вы получите ошибку ограничения уникальности.

рубин-на-рельсы, завещать,
Похожие вопросы
Яндекс.Метрика