ruby on rails - tutorial - Redirigir Devise before_filter: authenticate_user para iniciar sesión en la ruta
gema devise (3)
Agregué una página wiki que muestra la forma correcta de hacer esto con una aplicación fallida (como Steven insinuó inicialmente):
La clave es anular el método de route
, así:
# app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
def route(scope)
:new_user_registration_url
end
end
y luego haz que Devise use tu aplicación de falla:
# config/initializers/devise.rb
config.warden do |manager|
manager.failure_app = MyFailureApp
end
Este enfoque es preferible a anular authenticate_user!
en su controlador, ya que no va a contener muchas cosas "detrás de escena" que hace Devise, como almacenar el intento de URL para que el usuario pueda ser redirigido después de iniciar sesión correctamente.
Con múltiples tipos de usuarios.
Si tiene recursos de Admin
y diseño de User
, probablemente querrá mantener la funcionalidad predeterminada de "nueva sesión" para los administradores. Puede hacerlo fácilmente comprobando qué tipo de ámbito se está procesando:
# app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
def route(scope)
scope.to_sym == :user ? :new_user_registration_url : super
end
end
Estoy usando un dispositivo y tengo una pregunta rápida. ¿Cómo puedo redireccionar el: authenticate_user! ¿Antes de filtrar a la página de registro del usuario en lugar de iniciar sesión? He estado revisando https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb pero no he tenido mucha suerte para encontrar una solución.
Tendrá que crear una FailureApp personalizada que se herede de Devise''s FailureApp como se ve aquí: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-when-the-user-can-not-be-authenticated
Tuve un problema similar en el que tenía que redireccionar al registro si el usuario no había iniciado sesión. Lo arreglé agregando un método a application_controller.rb y usándolo como filtro anterior en los otros controladores.
Tenga en cuenta que es una solución más temporal porque omite un montón de abstracciones de dispositivos.
before_filter :auth_user
def auth_user
redirect_to new_user_registration_url unless user_signed_in?
end