2012-04-07 17 views
9

Oto, co mam na przekierowanie do domyślnego adresu URL (myapp_url). Ale chcę zmienić przekierowanie, aby przejść do adresu URL żądania, który został wprowadzony przez użytkownika po uwierzytelnieniu. Jak to zrobić? Próbowałem kilka opcji wyszukiwania tutaj, takich jak: wstecz. Ale nie idź.ruby ​​rails - przekierowanie na oryginalny URL żądania

Użytkownik wprowadza adres URL, jeśli nie zostanie uwierzytelniony, następnie zostaje przekierowany na stronę logowania, po zalogowaniu użytkownik zostanie przekierowany na pierwotny adres URL żądania.

def create 
    user = User.Authenticate(params[:user_id], params[:password]) 
if user 
    session[:user_id] = user.id 
    redirect_to myapp_url, :notice => "Logged in!" 
else 
    flash.now.alert = "Invalid email or password" 
    render "new" 
    end 

end 
+0

Znalazłeś rozwiązanie? –

+0

@ Aldo'xoen'Giambelluca - Jeszcze nie. –

+0

To rozwiązanie sprawdziło się: http://stackoverflow.com/questions/9835365/devise-how-to-redirect-to-different-pased-on-on-some-parameter-after-sign-in – rassom

Odpowiedz

1

Musisz zapisać ścieżkę w sesji przed przekierowaniem podczas uwierzytelniania i po udanym przekierowaniu auth do tej ścieżki.

+0

I próbowałem tego, ale bez powodzenia. 'session [: return_to] || = request.referer'' redirect_to session [: return_to] ' –

12

Możesz przeczytać the chapter about "Friendly forwarding" w "Ruby on Rails Tutorial" autorstwa Michaela Hartla, aby zobaczyć, jak możesz go łatwo zaimplementować.

Zasadniczo masz 3 metody pomocnika:

  1. store_location do przechowywania użytkownikowi odpowiednią lokalizację w sesji
  2. redirect_back_or(url) przekierować użytkownika do lokalizacji przechowywanych w sesji lub, jeśli nie jest ustawiona, do lokalizacji zawarte w url metody param
  3. i clear_return_to używane „wewnętrznie” metodą redirect_back_or aby usunąć tą informację kiedyś

I wtedy użyć następujących metod:

a) gdy widzisz Gość próby uzyskania dostępu do strony, która wymaga użycia uwierzytelniania store_location przed przekierować go do strony logowania.
B), gdy użytkownik jest zalogowany, należy użyć redirect_back_or(url) przekierować go na właściwym miejscu (jeśli oczywiście)

Jest to przegląd tego, jak ta praca, masz pomysł, ale proponuję, aby przeczytać, że rozdział do realizacji (kilka) szczegółów.

+0

Czy można to zrealizować za pomocą żądania postu? Załóżmy, że przesyłasz formularz, a sesja wygasła przed przesłaniem. Przykład Michaela Hartlesa spowodowałby błąd routingu. Myślę, że Railsy będą próbowały uzyskać żądanie po zalogowaniu. Na przykład, powiedzmy, że masz "Posty" i "komentarze", gdzie komentarze są zagnieżdżone pod postami, a komentarze są przesyłane z poziomu Postów #. Wynikowym adresem URL po zalogowaniu będzie "app.com/posts/1/comments", co spowoduje błąd routingu, co nie byłoby możliwe, gdyby żądanie było POST. – Mohamad

+1

Przekierowania są wysyłane przez przeglądarkę jako żądania GET. Nawet jeśli przeglądarka ma przekierowanie jako POST, oryginalne dane do przesyłania formularzy nie zostaną dostarczone. – kgilpin

+0

Link do tutoriala w odpowiedzi jest martwy, oto zaktualizowany link: https://www.railstutorial.org/book/_single-page#sec-friendly_forwarding – Nilloc