user_signed_in rails español ruby-on-rails devise

ruby on rails - rails - ¿Desea volver a redirigir a la ubicación original después de iniciar sesión o registrarse?



rails authentication (7)

Aquí estoy usando Devise Gem para la autenticación. Si alguien desea abrir una página sin iniciar sesión, se redirige a la página de inicio de sesión y, luego, vuelve a iniciar sesión en la página que el usuario intenta abrir. Utilizo el bucle de redirección con el enlace Devise after_sign_in_path_for para mi problema, pero no funciona para mí.

def after_sign_in_path_for(resource) params[:next] || super end

No me redirige a la página que quiero abrir. por ejemplo: si quiero abrir "127.0.0.1:3000/post/2/edit", no volveré a esta página después de iniciar sesión.


A partir de Devise 4 , funcionó perfectamente para mí:

Devise redirige automáticamente el inicio de sesión y el store_location_for(resource) siempre y cuando almacene la ubicación de la página actual utilizando store_location_for(resource) del store_location_for(resource) . Para hacer esto, edite su ApplicationController en app/controllers/application_controller.rb . Añadir:

# saves the location before loading each page so we can return to the # right page. If we''re on a devise page, we don''t want to store that as the # place to return to (for example, we don''t want to return to the sign in page # after signing in), which is what the :unless prevents before_filter :store_current_location, :unless => :devise_controller? private # override the devise helper to store the current location so we can # redirect to it after loggin in or out. This override makes signing in # and signing up work automatically. def store_current_location store_location_for(:user, request.url) end

Agregue lo siguiente a ApplicationController para hacer que la redirección de cierre de sesión:

private # override the devise method for where to go after signing out because theirs # always goes to the root path. Because devise uses a session variable and # the session is destroyed on log out, we need to use request.referrer # root_path is there as a backup def after_sign_out_path_for(resource) request.referrer || root_path end


Algunas de las otras soluciones aquí pueden no funcionar si su formulario de inicio de sesión tiene su propia página, a diferencia de, por ejemplo, un formulario de inicio de sesión en el encabezado de cada página. Después de iniciar sesión, el usuario debe retroceder dos páginas, no solo una.

Devise tiene un buen How to on https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update , de donde proviene el siguiente código.

Almacenar la URL original en la sesión es la mejor opción. Además de resolver el problema anterior de retroceder dos páginas, "muchos navegadores no envían el encabezado [del request.referer ]. Por lo tanto, la única forma robusta de cualquier navegador para implementar esta funcionalidad es mediante el uso de la sesión".

Al almacenar las URL en la sesión, es importante no almacenar la URL para ninguna solicitud POST, PUT o DELETE, ni ninguna solicitud XHR, es decir, nada a lo que el usuario no pueda ser redirigido.

Tenga en cuenta que después de cerrar la sesión, la sesión del usuario se destruye, por lo que la URL almacenada desaparece. En este caso, el usuario puede ser enviado de vuelta a request.referer . Esto parece aceptable ya que la mayoría de los sitios web tienen un enlace de cierre de sesión en cada página, por lo que volver a la referencia realmente funcionará.

class ApplicationController < ActionController::Base before_action :store_user_location!, if: :storable_location? before_action :authenticate_user! private def storable_location? request.get? && is_navigational_format? && !devise_controller? && !request.xhr? end def store_user_location! store_location_for(:user, request.fullpath) end def after_sign_in_path_for(resource_or_scope) stored_location_for(resource_or_scope) || super end def after_sign_out_path_for(resource_or_scope) request.referrer || super end end


Como se señaló en la documentación oficial, la solución más simple sería simplemente agregar esto a su application_controller.rb :

class ApplicationController < ActionController::Base private # If your model is called User def after_sign_in_path_for(resource) session["user_return_to"] || root_path end

Una nota importante (que también pasé por alto) es que para que esto funcione, ¡deberá llamar a authenticate_user! Método, disponible de forma predeterminada en Devise, en el controlador before_action: Esto llamará a store_location_for disponible fuera de la caja en Devise , y el resto lo maneja el código anterior en application_controller.rb , eliminando así la necesidad de volver a escribir el código para guardar la URL de la solicitud.


El mejor recurso para buscar es el repositorio oficial / wiki / issues, y luego SO. La respuesta que encontraste está desactualizada.

Aquí está la respuesta: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update

Solo agregue lo siguiente en ApplicationController para el diseño de versiones> 3.2.1:

# This example assumes that you have setup devise to authenticate a class named User. class ApplicationController < ActionController::Base before_action :store_user_location!, if: :storable_location? # The callback which stores the current location must be added before you authenticate the user # as `authenticate_user!` (or whatever your resource is) will halt the filter chain and redirect # before the location can be stored. before_action :authenticate_user! private # Its important that the location is NOT stored if: # - The request method is not GET (non idempotent) # - The request is handled by a Devise controller such as Devise::SessionsController as that could cause an # infinite redirect loop. # - The request is an Ajax request as this can lead to very unexpected behaviour. def storable_location? request.get? && is_navigational_format? && !devise_controller? && !request.xhr? end def store_user_location! # :user is the scope we are authenticating store_location_for(:user, request.fullpath) end end

Y luego, para redireccionar después de iniciar sesión, debe anular este método:

def after_sign_in_path_for(resource_or_scope) stored_location_for(resource_or_scope) || super end


No necesitas todo este código. Devise (como las últimas versiones) ya guarda la ubicación para usted.

Solo usa esto:

def after_sign_in_path_for(resource) request.env[''omniauth.origin''] || stored_location_for(resource) || root_url end

Esto redirigirá al usuario a la última omniauth.source, o la ubicación de almacenamiento y es el último caso, la url raíz.

Pensé que estaba obligado a crear ese método, pero Devise ya lo hace.

Fuente: https://github.com/plataformatec/devise/wiki/How-To:-redirect-to-a-specific-page-on-successful-sign-in


Tengo la misma duda y encontré esto, pruébalo también.

def after_sign_in_path_for(resource_or_scope) session.fetch ''user_return_to'', admin_root_path end


gem ''devise'', ''~> 4.4.0''

  1. Crear session_controller.rb: class SessionsController < Devise::SessionsController

  2. Agregue lo siguiente (modificar la expresión regular si su url de inicio de sesión no es / usuarios)

    def before_login session[:previous_url] = request.fullpath unless request.fullpath =~ ///users/ end def after_login session[:previous_url] || root_path end

Tenga en cuenta que esto no funciona si tiene / users / dashboard u otras ubicaciones en / users. Es posible que desee ser más específico con la expresión regular.