您好我的导轨应用程序我正在使用设计和omniauth。在那个我有一些奇怪的问题,每当我使用twitter,facebook和linkedin身份验证一起任何一个正常工作另一个是给出这个错误
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
如果像这样的measn linkedin工作和
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
如果这样意味着Twitter正在运作,否则所有人都会犯同样的错误我会做什么?
答案 0 :(得分:3)
当Devise为users表生成迁移时,它在电子邮件地址中包含唯一索引。 Devise还设置了模式,以便电子邮件默认为""而不是null。
因此,当您尝试保存无电子邮件记录时,它会找到一个电子邮件地址为""的现有记录。由于电子邮件地址必须是唯一的,因此会引发错误。
您可以尝试更改架构,以使唯一性的工作方式略有不同。例如:
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
这样可以将电子邮件地址保存为空,并且不会触发唯一性错误消息。