with rails google generate ruby-on-rails facebook-graph-api omniauth

ruby on rails - google - Rails: recuperando imágenes de Facebook después de iniciar sesión en Omniauth con Devise



rails devise generate views (1)

Configuré el inicio de sesión de Facebook con Devise y omniauth con estas instrucciones https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

La wiki de Devise da algunas instrucciones para obtener información de Facebook del hash almacenado en esta variable request.env[''omniauth.auth''] Vea la parte inferior del hash.

Por ejemplo, Devise wiki tiene estos dos métodos para el modelo User.rb

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) data = access_token.extra.raw_info if user = User.where(:email => data.email).first user else # Create a user with a stub password. User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) end end def self.new_with_session(params, session) super.tap do |user| if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] user.email = data["email"] end end end

Entonces, usando el hash a continuación, agregué lo siguiente a esos dos métodos para obtener el nombre y la imagen

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) data = access_token.extra.raw_info if user = User.where(:email => data.email).first user else # Create a user with a stub password. User.create!(:email => data.email, :password => Devise.friendly_token[0,20], :name => data.name, :image => access_token.info.image) #I added access_token.info.image based on first answer end end def self.new_with_session(params, session) super.tap do |user| if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] user.email = data["email"] user.name = data["name"] user.image = access_token.info.image #i changed this based on first answer below end end end

Luego, en mi opinión, agregué lo siguiente para mostrar el nombre de usuario y la imagen

<p>Name:<%= user.name %></p> <p>Image: <%= image_tag user.image %>

Sin embargo, solo se muestra el nombre. Sin imágen.

En mi base de datos, tengo un name y una columna de image . El nombre de Facebook se está almacenando, pero la columna de la imagen dice ''nil''

¿Alguna idea de cómo puedo conseguir que la imagen funcione?

Hash almacenado en request.env[''omniauth.auth''] https://github.com/mkdynamic/omniauth-facebook/blob/master/lib/omniauth/strategies/facebook.rb#L31-47

info do prune!({ ''nickname'' => raw_info[''username''], ''email'' => raw_info[''email''], ''name'' => raw_info[''name''], ''first_name'' => raw_info[''first_name''], ''last_name'' => raw_info[''last_name''], ''image'' => "#{options[:secure_image_url] ? ''https'' : ''http''}://graph.facebook.com/#{uid}/picture?type=square", ''description'' => raw_info[''bio''], ''urls'' => { ''Facebook'' => raw_info[''link''], ''Website'' => raw_info[''website''] }, ''location'' => (raw_info[''location''] || {})[''name''], ''verified'' => raw_info[''verified''] }) end


La imagen se puede encontrar en env["omniauth.auth"]["info"]["image"] . Así que en tu caso, access_token.info.image .

Si desea ver bien el hash de hashes anidados devueltos y ver por sí mismo dónde está todo, ponga esto como la primera línea de su controlador de devolución de llamada:

render :text => "<pre>" + env["omniauth.auth"].to_yaml and return

EDIT: Ok, entonces esto es lo que necesitas hacer:

def self.find_for_facebook_oauth(omniauth) if user = User.find_by_email(omniauth.info.email) if omniauth.info.image.present? user.update_attribute(:image, omniauth.info.image) end user else # Create a user with a stub password. User.create!(:email => omniauth.info.email, :name => omniauth.info.name, :image => omniauth.info.image, :password => Devise.friendly_token[0,20]) end end

En cuanto al otro método, si no me equivoco, debería verse así:

def self.new_with_session(params, session) super.tap do |user| if omniauth = session["devise.facebook_data"] user.email = omniauth.info.email user.name = omniauth.info.name user.image = omniauth.info.image end end end

Pero, ¿cuándo se usa este método? Devise lo utiliza cuando algo va mal al crear su usuario. Imagina que el proveedor de autenticación no te da un correo electrónico (Twitter, por ejemplo, hace esto), ¿qué puedes hacer? Bueno, puede redirigir al usuario a su página de registro donde puede completar el proceso de registro. Pero si redirecciona al usuario, perderá los datos recibidos por el usuario. La solución es poner estos datos en la sesión.

Entonces en tu controlador, deberías tener algo como:

if user.save sign_in_and_redirect user, :event => :authentication else session["devise.facebook_data"] = env["omniauth.auth"] redirect_to new_user_registration_url end

Sin embargo, otro problema es que la mayoría de las veces los datos devueltos por el proveedor de autenticación son demasiado grandes para que quepan en la sesión, por lo que tenemos que elegir exactamente lo que queremos incluir en la sesión. Ya que solo está obteniendo un nombre y una imagen, puede recortar la información adicional así:

session["devise.facebook_data"] = env["omniauth.auth"].except(''extra'')