2011-08-08 12 views
18

Tengo un botón de votación ajax: si un usuario hace clic en una imagen de "aprobación", pero no está conectado, entonces debería ver un cuadro de diálogo que le pide que inicie sesión primero.Después de un exitoso inicio de sesión de DEVISE, ¿cómo redirigir al usuario de vuelta a la acción previa que requería inicio de sesión?

Para hacer este cuadro de diálogo, estoy usando jQuery y facebox vinculado a ajax: evento de falla. Devise levantará un 401 no autorizado si el usuario no ha iniciado sesión. Facebox carga el html remoto para el inicio de sesión en un cuadro de diálogo emergente que presenta el formulario de inicio de sesión DEVISE.

Todo funciona, excepto después de un inicio de sesión exitoso, el usuario se redirige a la página de inicio. Sería más intuitivo si el usuario fuera redirigido de vuelta a la publicación que estaba mirando para poder continuar su voto.

¿Existe alguna forma de mejores prácticas para lograr este comportamiento?

Gracias.

+1

¿Qué tal un aceptar aquí? – coreyward

Respuesta

-1

utiliza una cookie. Obtenga la window.location.href a la que intentan acceder y almacénelo como una cookie. En su página de inicio, verificar la presencia de esta cookier en la función de lista de documentos, redirigir si su allí

+0

esto está relacionado con los redireccionamientos de Rails. Redirigir usando Javascript es erróneo. – Byron

19

que hacer lo siguiente con Authlogic en los carriles 3, tal vez se podría utilizar o hacer algo similar:

class ApplicationController < ActionController::Base 
    after_filter :store_location 
private 
    def store_location 
    session[:return_to] = request.fullpath 
    end 

    def clear_stored_location 
    session[:return_to] = nil 
    end 

    def redirect_back_or_to(alternate) 
    redirect_to(session[:return_to] || alternate) 
    clear_stored_location 
    end 
end 

Luego puede usar algo como redirect_back_or_to dashboard_path en su acción de inicio de sesión.

Para algunos controladores/acciones, no quiero almacenar la ubicación (por ejemplo, la página de inicio de sesión). Para aquellos que a saltar el filtro:

class UserController < ApplicationController 
    skip_after_filter :store_location 
end 

También hay una página en el wiki Diseñar en hacer esto: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in

+1

Este wiki de Devise [https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up, -actualizar] (https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,- actualización) tiene una solución mejor, más a prueba de balas, compruébelo antes de usar este código;) –

+1

@ViktorBenei No diría que es objetivamente mejor o "más a prueba de balas", pero es estilísticamente diferente, a pesar de operar muy similar. – coreyward

4

En ApplicationController escritura siguiente:

after_filter :store_location 
def store_location 
    session[:previous_urls] ||= [] 
    # store unique urls only 
    session[:previous_urls].prepend request.fullpath if session[:previous_urls].first != request.fullpath 
    # For Rails < 3.2 
    # session[:previous_urls].unshift request.fullpath if session[:previous_urls].first != request.fullpath 
    session[:previous_urls].pop if session[:previous_urls].count > 2 
end 
def after_sign_in_path_for(resource) 
    session[:previous_urls].last || root_path 
end 

Fuente: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update

+3

Nota: El wiki vinculado de Devise tiene una mejor solución, a prueba de balas, antes de usar este código. –

+0

Manera incorrecta para la situación cuando vaya a/firmar_desalida antes. Esta ruta se almacenará en previous_urls – SAHbKA

+0

Cambié 'after_filter' a 'before_action' porque mi filtro de autenticación redirigirá la solicitud no autorizada y, por lo tanto, no llamará: store_location en caso contrario. – Cheng

Cuestiones relacionadas