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]
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
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