2014-07-23 56 views
0

嗨在我的rails應用程序我使用devise和omniauth。在我有每當我使用Twitter,Facebook和LinkedIn認證一些奇怪的問題,同時任何一個正常工作另外一個是,如果這樣的measn LinkedIn給這個錯誤設計omniauth數據庫約束錯誤

SQLite3::ConstraintException: UNIQUE constraint failed: users.email: INSERT INTO  "users" ("created_at", "provider", "uid", "updated_at") VALUES (?, ?, ?, ?) 

在用戶mdoel

def self.from_omniauth(auth) 
     where(auth.slice(:provider, :uid)).first_or_create do |user| 
      user.provider =auth.provider 
      user.uid=auth.uid 
     end 
    end 

工作和

def self.from_omniauth(auth) 
     where(auth.slice(:provider, :uid)).first_or_create do |user| 
      user.provider =auth.provider 
      user.uid=auth.uid 
      user.email=auth.info.email 
     end 
    end 

如果像這樣意味着微博正在工作,否則所有給出相同的錯誤我該怎麼辦?

回答

3

當Devise爲用戶表生成遷移時,它會在電子郵件地址中包含一個唯一索引。設計也設置模式,以便電子郵件默認爲「」,而不是空。

因此,當您嘗試保存無電子郵件記錄時,它會找到一個電子郵件地址爲「」的現有記錄。由於電子郵件地址必須是唯一的,因此會引發錯誤。

您可以嘗試更改模式,以使唯一性的工作方式稍有不同。例如:

class ChangeEmailUniqueness < ActiveRecord::Migration 
    def up 
    remove_index "users", :name =>"index_users_on_email" 
    add_index "users", ["email", "provider", "uid"], :name => "index_users_on_identity", :unique => true 
    end 

    def down 
    remove_index "users", :name => "index_users_on_identity" 
    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    end 
end 

這並不完美,因爲它可以讓你有兩個不同的供應商註冊相同的電子郵件。

您也可以嘗試這樣的遷移:

class ChangeUserEmail < ActiveRecord::Migration 
    def change 
    change_column :users, :email, :string, null: true 
    end 
end 

這將允許電子郵件地址保存爲空並且不會觸發唯一的錯誤消息。