2008-10-23 9 views
5

Więc mam snazzy trasą niestandardową logowaniaPierwsze renderuje rozpoznać ścieżki niestandardowych routingu

# routes.rb 
map.login '/login', :controller => 'sessions', :action => 'new' 

Odwiedź www.asite.com/login i jesteś tam. Podobnie jak w przypadku nieudanego logowania, w naszej akcji zrobimy co następuje. Zanotuj, co się dzieje w przypadku nieudanego logowania

# sessions_controller.rb 

def create 
    self.current_user = User.authenticate(params[:email], params[:password]) 
    if logged_in? 
    # some work and redirect the user 
    else 
    flash.now[:warning] = "The email and/or password you entered is invalid." 
    render :action => 'new' 
    end 
end 

To bardzo typowe. Po prostu wyślij nową akcję i spróbuj ponownie się zalogować. Niestety dostaniesz również brzydki URL: www.asite.com/session. Ick! Czy można uzyskać zgodność z oryginalnym adresem URL?

+1

Zły przykład. Rozważ sytuacje, w których chcesz zachować tekst, który użytkownik już wypełnił w formularzu. Render to robi (ponieważ obiekt jest częściowo zbudowany). Przekierowanie traci stan. –

Odpowiedz

0

Zmień render :action => 'new' do redirect_to login_path

7

problem jest to: użytkownik pierwszy raz odwiedza /login i wypełnia formularz. Po przesłaniu formularza POST do /sessions, dlatego adres URL przeglądarki zmienia się. Aby obejść ten problem można zrobić dwie rzeczy:

Jak Michael wspomniano, można przekierować z powrotem do: nowego działania, zmieniając indziej:

else 
    flash[:warning] = "The email and/or password you entered is invalid." 
    redirect_to login_path 
end 

Zauważ, że musisz zmienić lampy błyskowej więc wiadomość jest dostępna w następnym żądaniu (po przekierowaniu).

Druga metoda jest trochę bardziej nieprzyjemna, ale być może warto wspomnieć. Korzystając z warunków na trasach, możesz odwzorować zarówno formularz logowania (który jest GET), jak i formularz submit (który jest POST) na tę samą ścieżkę. Coś takiego:

Następnie, jeśli Twoje działanie formularza jest ścieżką logowania, rzeczy powinny działać zgodnie z oczekiwaniami.