【问题标题】:Devise omniauth database constraints error设计omniauth数据库约束错误
【发布时间】:2014-07-23 06:46:37
【问题描述】:

您好,在我的 rails 应用程序中,我使用的是 devise 和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

如果这样意味着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 正在运行,否则都会出现相同的错误,我该怎么办?

【问题讨论】:

    标签: ruby-on-rails devise omniauth


    【解决方案1】:

    当 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多