设计omniauth数据库约束错误

时间:2014-07-23 06:46:38

标签: ruby-on-rails devise omniauth

您好我的导轨应用程序我正在使用设计和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正在运作,否则所有人都会犯同样的错误我会做什么?

1 个答案:

答案 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

这样可以将电子邮件地址保存为空,并且不会触发唯一性错误消息。