2012-02-09 8 views
5

Po wykonaniu:Rails 3.1 Devise OAuth dla Facebook splątanie routingu

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

mogę zapisać się do użytkownika za pośrednictwem Facebook. Ale walczę o zdefiniowanie własnych przekierowań.

Oczywiście jest to doskonały, że istniejący użytkownik, który już facebook podpisana w górę/w przekierowuje do mojej aplikacji i trwa dalej, ale to w przypadku użytkowników, którzy są nowo utworzone poprzez facebook jestem zainteresowany.

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 

Co oznacza user.persisted? find_for_facebook_oauth robi to samo, co strona devise wiki; tj. znajduje użytkownika pocztą elektroniczną i zwraca go, jeśli istnieje, lub tworzy nowego użytkownika z hasłem autogena, jeśli nie.

Ale potrzebuję go, aby przekierować nowo utworzonych użytkowników na stronę, na której ustawili swoje hasło. Nie chcę, aby hasło pośredniczące pozostało, chcę, aby użytkownicy natychmiast zostali wyświetleni z ekranem do a) potwierdzenia swojej nazwy i b) potwierdzenia swojego hasła.

Mam taki ekran zaimplementowany dla osób, które akceptują zaproszenia (przez https://github.com/scambra/devise_invitable/), które są w widokach/devise/invitations/edit - które byłyby idealnie do tego przystosowane, jeśli to zadziała.

Gdzie należy podać przekierowanie i jaki format powinien mieć tego rodzaju przekierowanie? Uważam, że metoda facebookowa jest dość myląca do interpretacji. Nie rozumiem, dlaczego kiedykolwiek przekieruje się do nowego adresu URL rejestracji użytkownika - użytkownik jest utworzony lub istnieje, więc do czego odnoszą się te, które działają?

Oczywiście mylić, więc doceniamy pomoc. :)

Dzięki

Dave

Odpowiedz

9

się .persisted? metoda sprawdza, czy rekord zostanie zapisany w bazie danych. Jest to metoda sprawdzania, czy użytkownik został znaleziony lub utworzony. Jeśli nie, przekierowuje na numer new_user_registration_url, ponieważ rejestracja zakończyła się niepowodzeniem (umożliwiając użytkownikowi ponowienie próby).

Aby przekierować na podstawie tego, czy użytkownik jest nowy, czy nie, można sprawdzić obiekt użytkownika pod kątem niektórych flag, które wskazują, że są nowe. Wspomniał pan o hasło, więc coś takiego może działać (niesprawdzone):

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 

alternatywę (jeśli chcesz uzyskać bardziej dopracowane), może chcesz dostosować after_sign_in_path_for(resource_or_scope), jak opisano on the Devise wiki

+1

Jesteś poprawne . Użyłem sign_in_count (części programu) do ustalenia, czy to użytkownicy logowali się po raz pierwszy, czy nie. Dzięki za jasne wyjaśnienie. – Dave

+0

nie ma problemu! zagłosuj jeśli jest pomocny :) –

+0

@Dave: W jakim pliku widoku powinien być zapisany kod? – inquisitive