web-dev-qa-db-fra.com

Comment accédez-vous aux contrôleurs Devise?

Les contrôleurs dans le système sont-ils automatiquement générés? Comment y accédez-vous? 

Je sais pour les vues que vous faites Rails generate devise_views.

37
katie

Devise utilise des contrôleurs internes, auxquels vous pouvez accéder et sous-classer dans votre propre code. Ils sont dans le module Devise. Par exemple, pour étendre la RegistrationsController:

class MembershipsController < Devise::RegistrationsController
  # ...
end

Ensuite, tout ce que vous avez à faire est de configurer les itinéraires de Devise pour utiliser votre contrôleur à la place:

devise_for :members, :controllers => { :registrations => 'memberships' }
38
Matheus Moreira

En supposant que vous souhaitiez voir ces contrôleurs afin de les modifier ou de les remplacer, Devise fournit désormais un simple générateur qui recrée leurs contrôleurs dans votre application pour faciliter les choses. Selon la documentation (qui sera la plus récente):

1) Créez vos contrôleurs personnalisés à l'aide du générateur qui nécessite une portée:

console

Rails generate devise:controllers [scope]

Si vous spécifiez users comme portée, les contrôleurs seront créés dans app/controllers/users/. Et le contrôleur de sessions ressemblera à ceci:

class Users::SessionsController < Devise::SessionsController
  # GET /resource/sign_in
  # def new
  #   super
  # end
  ...
end

2) Indiquez au routeur d'utiliser ce contrôleur:

devise_for :users, controllers: { sessions: "users/sessions" }

3) Copiez les vues de devise/sessions à users/sessions. Le contrôleur ayant été modifié, il n'utilise pas les vues par défaut situées dans devise/sessions.


4) Enfin, modifiez ou étendez les actions du contrôleur souhaitées.

Vous pouvez complètement annuler une action du contrôleur:

class Users::SessionsController < Devise::SessionsController
  def create
    # custom sign-in code
  end
end

Ou vous pouvez simplement y ajouter un nouveau comportement:

class Users::SessionsController < Devise::SessionsController
  def create
    super do |resource|
      BackgroundWorker.trigger(resource)
    end
  end
end

Ceci est utile pour déclencher des travaux en arrière-plan ou pour consigner des événements lors de certaines actions.

N'oubliez pas que Devise utilise des messages flash pour informer les utilisateurs du succès ou de l'échec de la connexion. Devise s'attend à ce que votre application appelle flash[:notice] et flash[:alert] selon le cas. N'imprimez pas l'intégralité du hachage du flash, imprimez uniquement des touches spécifiques. Dans certaines circonstances, Devise ajoute une touche :timedout au hash flash, qui n'est pas destiné à l'affichage. Supprimez cette clé du hachage si vous souhaitez imprimer l'intégralité du hachage.

39
Erik Trautman

$ Rails generate devise:controllers SCOPE [options]

Options: -c, [--controllers = un deux trois] 

Sélectionnez des contrôleurs spécifiques à générer (confirmations, mots de passe, inscriptions, sessions, déverrouillages, omniauth_callbacks)

Utilisez -c pour spécifier quel contrôleur vous voulez écraser . Si vous ne spécifiez pas de contrôleur, tous les contrôleurs seront créés . Par exemple:

Les Rails génèrent des cartes: contrôleurs utilisateurs -c = sessions

Cela va créer une classe de contrôleur dans app/controllers/users/sessions_controller.rb comme ceci:

 class Users::ConfirmationsController < Devise::ConfirmationsController
    content...
 end
10
indb

Ci-dessous, un pour Rails 5

Générez des contrôleurs de conception Rails en utilisant la commande suivante:

Rails generate devise:controllers users

si vous avez modifié les contrôleurs générés ci-dessus, ajoutez la ligne suivante au routes.rb

devise_for :users, controllers: {registrations:'user/registrations'}

Vos modifications prendront effet une fois que vous aurez redémarré le serveur Rails.

2

Pour définir le comportement du contrôleur personnalisé,

voir la réponse de @ ErikTrautman. 

Mais si vous essayez de comprendre ce que Devise fait sous le capot,

vous devez inspecter la source (plus précisément dans le répertoire app/ de la racine du projet). @MatheusMoreira fournit un lien vers la source sur GitHub, mais si vous préférez le parcourir localement dans votre propre éditeur de texte, vous pouvez trouver l'emplacement d'installation de la pierre Devise avec gem which devise.

Par exemple, pour voir Devise::SessionsController:

$ vim $(gem which devise | sed 's|\(.*\)\(/.*\)\{2\}|\1|')/app/controllers/devise/sessions_controller.rb

(Ou vous pouvez simplement cloner le dépôt git et fouiller de cette façon.)

$ git clone https://github.com/plataformatec/devise
$ cd devise
$ vim app/controllers/devise/sessions_controller.rb
0
Ryan Lue