2016-05-10 13 views
0

Ich verwende Rails 4.2.3. Ich möchte Google und Facebook verwenden, um Benutzer in meinem System zu authentifizieren (und zu erstellen). So habe ich dies in meiner app/models/user.rb Datei ...Wie verhindere ich, dass ein doppelter Benutzer in meiner Rails-Anwendung erstellt wird?

def self.from_omniauth(auth) 
    where(provider: auth.provider, uid: auth.uid).first_or_create do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.email = auth.info.email 
     user.name = auth.info.name 
     user.oauth_token = auth.credentials.token 
     user.oauth_expires_at = Time.at(auth.credentials.expires_at) 
     user.save! 
    end 
    end 

Das Problem mit der oben ist, wenn ich bereits eine Zeile in der Datenbank haben, wie unter

id | provider |   uid   |  name  | oauth_token | oauth_expires_at |   created_at   |   updated_at   |   email   
----+---------------+-----------------------+---------------+-------------+------------------+----------------------------+----------------------------+------------------------- 
    5 | google-oauth2 | 777711643329020555465 | Dave A  |    |     | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | [email protected] 

beim Einloggen Mit Google und dem Aufruf der obigen Methode wird eine zweite Zeile mit identischen Daten erstellt. Wer weiß, was ich tun kann, um Dinge so zu optimieren, dass, wenn es bereits eine Zeile in meiner Datenbank für den Benutzer gibt, das Aufrufen der obigen Methode keinen zweiten, doppelten Benutzer erzeugt.

Danke, - Dave

Edit: Hier ist, was die db aussieht, nachdem in via Google OAuth Anmeldung

id | provider |   uid   |  name  |         oauth_token         | oauth_expires_at |   created_at   |   updated_at   |   email   
----+---------------+-----------------------+---------------+-----------------------------------------------------------------------------+---------------------+----------------------------+----------------------------+------------------------- 
    5 | google-oauth2 | 777711643329020555465 | Dave A  |                    |      | 2016-05-10 20:08:59.182744 | 2016-05-10 20:08:59.182744 | [email protected] 
    7 | google_oauth2 | 777711643329020555465 | D. A.   | ya29.CjLeAiJ--FTY1UhMwXdb7yk74hhdCH4O6sz3ewbG8wBNdmRHAJWZ0esoS0yZLp5fXmS60Q | 2016-05-10 21:49:55 | 2016-05-10 20:49:57.277341 | 2016-05-10 20:49:57.277341 | [email protected] 

Antwort

1

Sie nicht save verwenden sollten, first_or_create wird es für Sie sparen, wenn es wird das Spiel nicht finden, sehen http://apidock.com/rails/ActiveRecord/Relation/first_or_create

So diese einfach entfernen: user.save!

+0

Ich habe getan, wie Sie vorgeschlagen haben, aber es hat immer noch nicht funktioniert. Ich habe die Daten, die in meiner Tabelle enthalten sind, in meine Frage aufgenommen. Der Name, oauth token und oauth expires Felder sind unterschiedlich, aber ich glaube nicht, dass das wichtig ist, da UID, Provider und Emails gleich sind. – Dave

+0

Sie müssen angeben, auf welche Spalten der 'first_or_create' die Duplikatprüfung durchführen soll. Ich denke, dies sollte nur im Feld 'uid' erfolgen. Sehen Sie sich die Dokumentation an: http://apidock.com/rails/ActiveRecord/Relation/first_or_create – Augusto

Verwandte Themen