PG :: UniqueViolation:ERROR:重复键值违反唯一约束

pra*_*mar 6 ruby-on-rails devise

我在rails(4.2.6)中使用devise(4.2.0).

在我的应用程序中,我在用户和配置文件表中使用嵌套属性.我只有在创建新记录时才需要验证密码,在更新创建的记录时未验证密码字段.

我的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
Run Code Online (Sandbox Code Playgroud)

当我运行我的应用程序时出现此错误:

PG::UniqueViolation: ERROR: duplicate key value violates unique constraint "index_users_on_email" DETAIL: Key (email)=() already exists. : INSERT INTO "users" ("first_name", "last_name", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"
Run Code Online (Sandbox Code Playgroud)

我搜索了这个问题,但我无法解决它.

schemafile中的用户和配置文件表

create_table "users", force: :cascade do |t|
   t.string   "email",                  default: "", null: false
   t.string   "encrypted_password",     default: "", null: false
   t.string   "reset_password_token"
   t.datetime "reset_password_sent_at"
   t.datetime "remember_created_at"
   t.integer  "sign_in_count",          default: 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.string   "user_id"
 end

 add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree
 add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree        
 add_index "profiles", ["user_id"], name: "index_profiles_on_user_id", using: :btree

create_table "profiles", force: :cascade do |t|
   t.string   "company_name"
   t.integer  "country"
   t.integer  "state"
   t.integer  "business"
   t.string   "mobile_no"
   t.datetime "created_at",       null: false
   t.datetime "updated_at",       null: false
   t.integer  "user_id"
   t.boolean  "terms_conditions"
 end
Run Code Online (Sandbox Code Playgroud)

Nit*_*ant 19

看看你的test/fixtures/users.yml文件并注释掉任何空白的灯具.见下面的例子:

#one: {}
#two: {}
Run Code Online (Sandbox Code Playgroud)

  • @xenetics因为这是注释掉两个空白模型的定义,`one`和`two`.如果模型在夹具中没有设置属性,则默认为null.如果您对空行或重复行进行了验证,那么在为同一列插入两个空值时它将失败. (2认同)

小智 7

我也面临同样的问题,删除数据库并重新创建它.

rake db:drop
rake db:create
rake db:migrate
Run Code Online (Sandbox Code Playgroud)

希望它会奏效