Question

J'ai donc un itinéraire personnalisé accrocheur pour la connexion

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

Visitez www.asite.com/login et vous y êtes. Comme d'habitude avec un échec de connexion, toutefois, nous allons procéder comme suit. Notez ce qui se passe en cas d'échec de la connexion.

 # 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

C'est très typique. Rendez simplement la nouvelle action et invitez-vous à vous connecter à nouveau. Malheureusement, vous obtenez également une URL laide: www.asite.com/session. Ick! Est-il possible d'obtenir un rendu respectant l'URL d'origine?

Pas de solution correcte

Autres conseils

Votre problème est le suivant: l'utilisateur visite d'abord / login et remplit le formulaire. Lorsqu’ils envoient le formulaire, ils postent à / sessions , c’est pourquoi l’URL du navigateur change. Pour résoudre ce problème, vous pouvez faire deux choses:

Comme Michael l’a mentionné, vous pouvez rediriger vers la: nouvelle action en remplaçant l’autre par:

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

Notez que vous devrez changer le flash pour que le message soit disponible dans la demande suivante (après la redirection).

La deuxième méthode est légèrement plus compliquée, mais mérite peut-être d'être mentionnée. En utilisant des conditions sur vos itinéraires, vous pouvez mapper le formulaire de connexion (qui est un GET) et le formulaire d'envoi (qui est un POST) sur le même chemin. Quelque chose comme:

map.login '/login',
  :controller => 'sessions', :action => 'new', 
  :conditions => {:method => :get}

map.login_submit '/login',
  :controller => 'sessions', :action => 'create', 
  :conditions => {:method => :post}

Ensuite, si votre action de formulaire est un chemin de soumission de connexion, les choses doivent fonctionner comme prévu.

Modifier render: action = > 'new' to redirect_to login_path

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top