2012-04-07 44 views
9

Esto es lo que tengo para redirigir a una url predeterminada (myapp_url). Pero quiero cambiar la redirección para ir a la URL de solicitud que el usuario ingresó después de la autenticación. ¿Cómo hago eso? Intenté algunas opciones desde buscar aquí, como: volver. Pero no ir.ruby ​​rails - redirigir a la URL de solicitud original

El usuario ingresa una url, si no se autentica, se redirecciona a la página de inicio de sesión, y luego de iniciar sesión, el usuario debe ser redirigido a la URL de solicitud original.

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

¿Has encontrado una solución? –

+0

@ Aldo'xoen'Giambelluca - Todavía no. –

+0

Esta solución funcionó para mí: http://stackoverflow.com/questions/9835365/devise-how-to-redirect-to-different-page-based-on-some-parameter-after-sign-in – rassom

Respuesta

1

Debe guardar la ruta en sesión antes de la redirección en la autenticación, y después de la auth exitosa redirigir a esta ruta.

+0

I intenté esto, pero no tuve suerte. 'session [: return_to] || = request.referer'' redirect_to session [: return_to] ' –

12

Puede leer the chapter about "Friendly forwarding" en el "Tutorial de Ruby on Rails" de Michael Hartl para ver cómo puede implementarlo fácilmente.

Básicamente, usted tiene 3 métodos de ayuda:

  1. store_location para almacenar el usuario ubicación deseada en la sesión
  2. redirect_back_or(url) redirigir al usuario a la ubicación almacenada en la sesión o, si no se establece, para la ubicación contenida en el parámetro url método
  3. y clear_return_to utilizado "internamente" por el método redirect_back_or para borrar esta pieza de información una vez utilizado

Y a continuación, utiliza estos métodos:

A) cuando se ve un usuario invitado intenta acceder a una página que necesita el uso de autenticación store_location delante de él redirigir a la página de inicio de sesión.
B) cuando un usuario ha iniciado sesión, se utilizan redirect_back_or(url) le redirigir a la ubicación correcta (si está presente, por supuesto)

Ésta es una visión general de cómo este trabajo, se entiende la idea pero sugiero leer que capítulo para la implementación (pocos) detalles.

+0

¿Se puede implementar esto con una solicitud posterior? Supongamos que envía un formulario y la sesión expiró antes de la presentación. El ejemplo de Michael Hartles causaría un error de enrutamiento. Creo que Rails intentará obtener una solicitud después de iniciar sesión. Por ejemplo, supongamos que tiene 'Publicaciones' y' Comentarios', donde los comentarios están anidados en las publicaciones y las presentaciones de comentarios se realizan en el programa Publicaciones #. La URL resultante después de iniciar sesión sería 'app.com/posts/1/comments' causando un error de enrutamiento, que no sería el caso si la solicitud fuera POST. – Mohamad

+1

Los redireccionamientos son enviados por el navegador como solicitudes GET. Incluso si tiene el navegador para redirigir como POST, no se proporcionarán los datos originales de envío del formulario. – kgilpin

+0

El enlace del tutorial en la respuesta está muerto, aquí hay un enlace actualizado: https://www.railstutorial.org/book/_single-page#sec-friendly_forwarding – Nilloc

Cuestiones relacionadas