web-dev-qa-db-fra.com

Rediriger Devise before_filter: authenticate_user vers le chemin de connexion

J'utilise le logiciel et j'ai une petite question. Comment puis-je rediriger le: authenticate_user! before_filter sur la page d'inscription de l'utilisateur au lieu de vous connecter? J'ai parcouru https://github.com/plataformatec/devise/blob/master/lib/devise/controllers/helpers.rb mais je n'ai pas eu beaucoup de chance de trouver une solution.

22
Glenn

Vous allez devoir créer un FailureApp personnalisé qui hérite de FailureApp de Devise, comme indiqué ici: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page -lorsque l'utilisateur peut ne pas être authentifié

8
Steve

J'ai eu un problème similaire où je devais rediriger vers l'inscription si l'utilisateur n'était pas connecté. Je l'ai corrigé en ajoutant une méthode à application_controller.rb et en l'utilisant comme filtre avant dans les autres contrôleurs.

Gardez à l’esprit que c’est une solution temporaire, car elle évite de nombreuses abstractions.


before_filter :auth_user

  def auth_user
    redirect_to new_user_registration_url unless user_signed_in?
  end
44
Baconator507

J'ai ajouté une page wiki montrant la bonne façon de faire cela avec une application en échec (comme Steven l'avait initialement laissé entendre):

La clé est de remplacer la méthode route, comme ceci:

# app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
  def route(scope)
    :new_user_registration_url
  end
end

puis demandez à Devise d'utiliser votre application d'échec:

# config/initializers/devise.rb
config.warden do |manager|
  manager.failure_app = MyFailureApp
end

Cette approche est préférable au remplacement de authenticate_user! dans votre contrôleur car cela ne gênera pas beaucoup de choses "en coulisse" que Devise fait, telles que le stockage de l'URL tentée afin que l'utilisateur puisse être redirigé après une connexion réussie.

Avec plusieurs types d'utilisateurs

Si vous avez des ressources Admin et User Devise, vous voudrez probablement conserver la fonctionnalité par défaut de "nouvelle session" pour les administrateurs. Vous pouvez le faire assez facilement en vérifiant quel type d'étendue est en cours de traitement:

# app/lib/my_failure_app.rb
class MyFailureApp < Devise::FailureApp
  def route(scope)
    scope.to_sym == :user ? :new_user_registration_url : super
  end
end
0
Kyle Fox