Rails 3.1 Разработайте Oauth для путаницы в Facebook - PullRequest
5 голосов
/ 09 февраля 2012

После:

https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview

Я могу зарегистрировать пользователя через Facebook.Но я изо всех сил пытаюсь определить свои собственные перенаправления.

Очевидно, идеально, что существующий пользователь, который уже зарегистрировался в Facebook, перенаправляет в мое приложение и продолжает, но это случай новых пользователей, которые были созданыЯ заинтересован в Facebook.

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
  def facebook
    # You need to implement the method below in your model
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user)

    if @user.persisted?
      flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
      sign_in_and_redirect @user, :event => :authentication
    else
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end
end

Что означает user.persisted?find_for_facebook_oauth делает то же самое, что и вики-страница devise;т.е. находит пользователя по электронной почте и возвращает его, если он существует, или создает нового пользователя с паролем автогена, если нет.

Но мне нужно перенаправить вновь созданных пользователей на страницу, где они устанавливают свои пароли.Я не хочу, чтобы пароль-заглушка сохранялся, я хочу, чтобы пользователям сразу же был представлен экран с: а) подтверждением их имени и б) подтверждением их пароля.

У меня такой экран реализован для людей, которые принимаютприглашает (через https://github.com/scambra/devise_invitable/), который находится в views / devise / invitations / edit - что было бы идеально подходит для этого, если это будет работать.

Где я должен добавить перенаправление и какой формат будеттакое перенаправление взять?Я нахожу вышеописанный метод в Фейсбуке довольно непонятным для толкования.Я не могу понять, почему он будет перенаправлять на новый URL-адрес регистрации пользователя - пользователь создан или существует, так с чем же связано сохранение?

Очевидно, что запутался, поэтому помощь приветствуется.:)

Спасибо,

Дэйв

1 Ответ

9 голосов
/ 10 февраля 2012

метод .persisted? проверяет, сохраняется ли эта запись в вашей базе данных.Это метод проверки, был ли пользователь успешно найден или создан.Если нет, он перенаправляется на new_user_registration_url, поскольку регистрация не удалась (что позволило пользователю повторить попытку).

Для перенаправления на основе того, является ли пользователь новым или нет, вы можете проверить объект пользователя нанекоторый флаг, который указывает, что они новы.Вы упомянули пароль, поэтому что-то подобное может работать (не проверено):

if @user.persisted?
  flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook"
  if @user.password.exists?
    sign_in_and_redirect @user, :event => :authentication
  else
    sign_in @user
    redirect_to ______ #insert path to set password etc
  end
else
  session["devise.facebook_data"] = request.env["omniauth.auth"]
  redirect_to new_user_registration_url
end

альтернатива (если вы хотите получить более точную настройку), вы можете настроить after_sign_in_path_for(resource_or_scope), как описано на вики-устройстве Devise

...