2017-07-07 9 views
0

Ich benutze omniauth (omniauth-facebook) in meiner Ruby on Rails Applikation. Ich würde gerne wissen, ob ich Informationen zu Stadt, Land und Geschlecht des Benutzers abrufen kann. Und wie kann ich Benutzer Profil Foto mit Carrierwave,Ruby on Rails omniauth und carrierwave

Danke nehmen.

Antwort

0

Wenn Sie die (Carrierwave-Dokumentation) [https://github.com/carrierwaveuploader/carrierwave] als Referenz verwenden, müssen Sie Ihr Benutzermodell ändern, um neue Felder zur Unterstützung der carrierwave-Juwel-Funktion hinzuzufügen.

Normalerweise bedeutet dies:

class User < ActiveRecord::Base 
    mount_uploader :avatar, AvatarUploader 
end 

Aber es wird variieren, wenn Sie MongoDB anstelle einer SQL/Activerecord verwenden.

Sie können dieses neue Feld testen, indem Sie ein neues Objekt in der Rails-Konsole initialisieren und die verfügbaren Felder prüfen.

bundle exec rails c 

u = User.new 
u.(tab twice quickly to see the available options) 
# You are looking for the avatar field 
u.avatar 

Sie können es von der Konsole setzen, es zu testen mit

File.open('somewhere') do |f| 
    u.avatar = f 
end 

Dann endlich du es das Formularfeld in Ihre Ansichten hinzufügen würde, sobald Sie es getestet. Normalerweise haben Sie einen CRUD für Ihren Benutzer. In den Formularen zum Erstellen/Aktualisieren in den Ansichten ändern Sie diese Formulare so, dass sie ein Dateiformular enthalten (das ist HTML, nicht spezifisch rails, so dass Sie bei der Suche nach mehr Informationen suchen können). Nach dem Hinzufügen müssen Sie die entsprechenden Controller ändern, um den Wert auf die weiße Liste zu setzen, damit er mit diesen Controller-Aktionen gespeichert werden kann.

Der Prozess ähnelt dem Hinzufügen anderer Felder zu Ihrem Benutzerobjekt nach der ersten Generierung des Benutzermodells.

0

Normalerweise omniauth wird eine Standard-Antwort zurück, die nur mit Authentifizierung, im Grunde einen Hash mit einer Kombination aus email, name/first/last, profile_picture url, username usw. Einige Anbieter geben Sie eine E-Mail, andere nicht, einige andere nur betrifft liefern Felder, wenn Sie durch Bereiche speziell nach ihnen fragen.

Für facebook ich folgendes auf meinem omniauth.rb mit (innen config/initializers/*)

provider :facebook, ENV['FB_ID'], ENV['FB_SECRET'], scope: 'public_profile, email, manage_pages, user_friends', info_fields: 'id, first_name, last_name, link, email', image_size: 'large' 

Das bedeutet, dass Facebook mir eine E-Mail zur Verfügung stellen wird, einige grundlegende Informationen wie ID, zuerst Name und Nachname auf dem Response-Hash (das omniauth kümmert sich um das Arrangieren) nach erfolgreicher Oauth-Autorisierung. Das Token, das es zur Verfügung stellt, wird auch für die Verwaltung von Seiten verwendet, obwohl ich zunächst kein Feld dazu benötige.

Also in Ihrem Fall würden Sie nach city, country und was auch immer in info_fields fragen (doppelte Überprüfung durch ihre Grafik-Explorer, dass Sie keinen zusätzlichen Bereich für diese Felder benötigen).

Nachdem Sie die Antwort durch omniauth erhalten haben (was im Grunde genommen ein Stück Code ist, das als Middleware geschrieben ist, das ist der oauth2-Fluss für Sie - Sie könnten es auch selbst machen), haben Sie eine Profilbild-URL. Sie möchten dieses Bild herunterladen. Mit carrierwave tun Sie dies entweder auf Ihrem Controller oder Modul/Klasse durch Instanziieren der Spalte, in der Sie den Uploader gesetzt haben und dann die Methode .download!es die URL von vorbei, wo zum Download:

user.avatar = AvatarUploader.new 
user.avatar.download! omniauth_hash['blabla_fields']['blabla_picture_url'] 

Dies wird eine Remote-Bild-URL herunterladen und als regulärer carrierwave Anhang speichern, dass Sie dann durch Ihr Modell normalerweise zugreifen können.