2013-10-14 47 views
1

我是絕對新的Rails,我幾乎不知道我在做什麼。但。問題是:註冊新用戶設計的結果:SQLite3 :: ConstraintException:列電子郵件是不唯一的

SQLite3::ConstraintException: column email is not unique: 
INSERT INTO "users" ("created_at","encrypted_password", "name", "updated_at") 
VALUES (?, ?, ?, ?) 

和請求參數:

{"utf8"=>"✓", 
"authenticity_token"=>"1bgk4ovS3JitphVkIvcCZi3ex8QsBq4eEf6ZihQLiHg=", 
"user"=>{"name"=>"Someone", 
"email"=>"[email protected]", 
"password"=>"[FILTERED]"}, 
"commit"=>"Sign up"} 

用戶模式:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :confirmable, 
    # :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable; 
end 

DB遷移:

class DeviseCreateUsers < ActiveRecord::Migration 
    def self.up 
    change_table(:users) do |t| 
     ## Database authenticatable 
     t.string :email,    :null => false, :default => "" 
     t.string :name,    :null => false, :default => "" 
     t.string :encrypted_password, :null => false, :default => "" 

     ## Recoverable 
     t.string :reset_password_token 
     t.datetime :reset_password_sent_at 

     ## Rememberable 
     t.datetime :remember_created_at 

     ## Trackable 
     t.integer :sign_in_count, :default => 0 
     t.datetime :current_sign_in_at 
     t.datetime :last_sign_in_at 
     t.string :current_sign_in_ip 
     t.string :last_sign_in_ip 

     ## Confirmable 
     # t.string :confirmation_token 
     # t.datetime :confirmed_at 
     # t.datetime :confirmation_sent_at 
     # t.string :unconfirmed_email # Only if using reconfirmable 

     ## Lockable 
     # t.integer :failed_attempts, :default => 0 # Only if lock strategy is :failed_attempts 
     # t.string :unlock_token # Only if unlock strategy is :email or :both 
     # t.datetime :locked_at 

     ## Token authenticatable 
     # t.string :authentication_token 


     # Uncomment below if timestamps were not included in your original model. 
     # t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :name,     :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    # add_index :users, :authentication_token, :unique => true 
    end 

    def self.down 
    # By default, we don't want to make any assumption about how to roll back a migration when your 
    # model already existed. Please edit below which fields you would like to remove in this migration. 
    end 
end 

請告訴我if我需要提供任何其他代碼。 並感謝您提前提供的所有幫助。

更新與DB模式:

ActiveRecord::Schema.define(version: 20131012114812) do 

    create_table "users", force: true 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.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "name" 
    end 

    add_index "users", ["email"], name: "index_users_on_email", unique: true 
    add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true 

end 

更新2:而且也有需要鑑定的問題。對於以前成功註冊的用戶嘗試登錄,Devise會告知「無效的電子郵件或密碼」。

+1

看起來你遇到同樣的問題: 的http://計算器。com/questions/5769758 /添加索引到電子郵件列罪魁禍首爲單元測試失敗 – Dave

+0

嗯。嘗試[drop](http://stackoverflow.com/questions/4020131/rails-db-migration-how-to-drop-a-table)一個用戶表。這是你不應該做的事情,但它可以幫助你。 – user2422869

+0

@Dave Devise在安裝完成後完美運行。所以我不相信。 –

回答

1

嘗試添加獨特的驗證到您的User型號:

validates_uniqueness_of :email, :allow_blank => true 

這將重新呈現您的用戶創建形式,而不是產生錯誤。

+0

試過了。設計拋出「電子郵件已被採納」的錯誤。所提供的電子郵件對於應用程序來說絕對是新的。 –

+0

@VladislavIvanov我認爲你遇到的問題是它確保電子郵件的唯一性,但是如果你想讓電子郵件有一個空白的默認值,你將不得不使用':allow_blank => true'來接受空白值。看到我上面的更新的答案,並希望這對你有用。 – jvperrin

+0

謝謝你的建議,但現在我得到了應用程序錯誤'SQLite3 :: ConstraintException:列電子郵件不是唯一的:INSERT INTO「users」(「created_at」,「encrypted_pa​​ssword」,「name」,「updated_at」)VALUES ?,?,?,?)' –

1

該數據庫中是否有其他「電子郵件」列?

也許你已經有了一個「用戶」表,其中email列已被Devise複製。如果你能向我們展示你的表有哪些列,這將是有幫助的:)

+0

謝謝,我更新了這個問題。 –

+1

SQLite3 :: ConstraintException:列電子郵件不是唯一的: INSERT INTO「users」(「created_at」,「encrypted_pa​​ssword」,「name」,「updated_at」) VALUES(?,?,?,?) - >看起來像你沒有插入一個電子郵件與此查詢?這可能是問題嗎? –

+0

我該如何檢查?我是一個真正的newby順便說一句:-) –

4

SQLite告訴你,它試圖創建一個新的記錄,其中一個值將是一個電子郵件,但已經存在一條記錄與該電子郵件。

一個簡單的方法來讀取你的數據庫中的記錄是查詢數據庫中的一個終端窗口:

$ rails console 
$ User.all 

如果你想看到你的測試數據庫,這將載入您的燈具:

$ rails console -e=test 
$ User.all 

查找與您嘗試創建的電子郵件具有相同電子郵件的記錄。

如果這是你第一次使用Devise,你應該檢查你的燈具。設計目前默認爲兩個沒有屬性的燈具。如果您正在測試環境中運行,那麼這些固件將作爲電子郵件的nil值的兩條記錄加載到測試數據庫中,這些值是重複的電子郵件值。像下面的燈具會讓你通過你的錯誤信息。

file: app/test/fixtures/users.yml 

one: 
    email: [email protected] 
    encrypted_password: password1 

two: 
    email: [email protected] 
    encrypted_password: password2 
相關問題