Pregunta

Así que tengo una ruta personalizada elegante para iniciar sesión

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

Visite www.asite.com/login y ya está. Sin embargo, como es costumbre con el inicio de sesión fallido, haremos lo siguiente en nuestra acción. Tenga en cuenta lo que sucede en el inicio de sesión fallido.

 # 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

Esto es muy típico. Simplemente procese la nueva acción y solicite el inicio de sesión nuevamente. Desafortunadamente, también obtienes una URL fea: www.asite.com/session. Ick! ¿Es posible obtener renderizado para respetar la URL original?

No hay solución correcta

Otros consejos

Su problema es este: el usuario primero visita / login y completa el formulario. Cuando envían el formulario, PUBLICAN en / sessions , por lo que cambia la URL del navegador. Para solucionar esto puedes hacer dos cosas:

Como Michael mencionó, puede redirigir de nuevo a: nueva acción, cambiando el resto a:

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

Tenga en cuenta que tendrá que cambiar el flash para que el mensaje esté disponible en la próxima solicitud (siguiendo la redirección).

El segundo método es un poco más complicado, pero quizás vale la pena mencionarlo. Al utilizar las condiciones en sus rutas, puede asignar tanto el formulario de inicio de sesión (que es un GET) como el envío del formulario (que es un POST) a la misma ruta. Algo así como:

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

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

Entonces, si su acción de formulario es la ruta de acceso de inicio de sesión, las cosas deberían funcionar como espera.

Cambiar render: action = > 'nuevo' a redirect_to login_path

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top