2016-09-15 155 views
2

我在rails(4.2.6)中使用devise(4.2.0)。PG :: UniqueViolation:錯誤:重複鍵值違反唯一約束

在我的應用程序中,我在用戶和配置文件表中使用了嵌套屬性。我只需要在創建新記錄時驗證密碼,當更新創建的記錄時密碼字段未經驗證。

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 

當我運行我的應用程序時出現此錯誤:

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" 

我搜索了這個問題,但我不能夠解決這個問題。

用戶&配置表中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 
+0

添加模式文件 – siegy22

+0

你們是不是要註冊使用現有的電子郵件的問題(位於'DB/schema.rb')? – pdoherty926

+0

不,我正在更新現有的用戶詳細信息(名字,姓氏等) – praveenkumar

回答

6

我也遇到了同樣的問題, 刪除數據庫並重新創建它。

rake db:drop 
 
rake db:create 
 
rake db:migrate

希望它會工作

6

看看你的測試/夾具/ users.yml裏的文件和註釋掉任何空白燈具。看下面的例子:

#one: {} 
#two: {} 
+1

這是我的。爲什麼這個工作? – xenetics

2

你插入一個用戶沒有電子郵件,你已經有一個。如果你想忽略重複檢查的空白,改變你的驗證:

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