Изображение можно найти на env["omniauth.auth"]["info"]["image"]
.Так что в вашем случае, access_token.info.image
.
Если вы хотите внимательно посмотреть на возвращенный хеш вложенных хешей и убедиться, где все, поместите это в качестве первой строки вашего контроллера обратного вызова:
render :text => "<pre>" + env["omniauth.auth"].to_yaml and return
РЕДАКТИРОВАТЬ: Хорошо, вот что вам нужно сделать:
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
Что касается другого метода, если я не ошибаюсь, он должен выглядеть так:
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
Но когда этот метод используется?Он используется Devise, когда что-то идет не так при создании вашего пользователя.Представьте, что провайдер аутентификации не дает вам электронную почту (например, это делает Twitter), что вы можете сделать?Ну, вы можете перенаправить пользователя на свою страницу регистрации, где он может завершить процесс регистрации.Но если вы перенаправите пользователя, вы потеряете данные, полученные oauth.Решение состоит в том, чтобы поместить эти данные в сеанс.
Итак, в вашем контроллере должно быть что-то вроде:
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
Однако другая проблема заключается в том, что в большинстве случаеввозвращенный провайдером аутентификации слишком большой, чтобы поместиться в сеансе, поэтому мы должны точно выбрать, что мы хотим поместить в сеанс.Поскольку вы получаете только имя и изображение, вы можете обрезать дополнительную информацию следующим образом:
session["devise.facebook_data"] = env["omniauth.auth"].except('extra')