web-dev-qa-db-fra.com

Comment créer manuellement un nouvel utilisateur et une nouvelle session utilisateur dans Devise?

J'ai un formulaire où je recueille beaucoup d'informations dans Rails. Une partie de ce formulaire contient des champs pour un nouvel utilisateur à inscrire. Étant donné que Devise a des contrôleurs/actions spécifiquement pour créer un nouvel utilisateur, je ne sais pas comment créer par programme un utilisateur dans une action entièrement différente qui crée également un autre enregistrement. Je ne peux vraiment pas séparer le formulaire d'inscription de l'utilisateur. Je ne peux pas comprendre comment créer un utilisateur, puis me connecter, comme je pourrais facilement le faire dans Authlogic.

J'ai utilisé Authlogic et Devise, et je pense que chacun a ses forces et ses faiblesses. Avec Devise, j'adore la rapidité avec laquelle il est possible de "démarrer" avec un nouveau projet, mais la personnalisation semble être pénible. Authlogic a eu tellement de problèmes avec Rails 3 il y a quelque temps, que je suis passé à Devise. Je travaille maintenant sur un nouveau projet et je peux recommencer à zéro.

Je pense donc qu'il y a 2 réponses potentielles à cette question: (a) comment faire cela dans Devise, ou (b) pourquoi je devrais simplement passer à Authlogic avec Rails 3 à la place).

47
Sean Coleman

Vous pouvez créer un nouvel utilisateur Devise simplement en créant un nouveau modèle utilisateur (voir https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface )

@user = User.new(:email => '[email protected]', :password => 'password', :password_confirmation => 'password')
@user.save

Pour vous connecter à votre nouvel utilisateur, utilisez sign_in @user

84
David Sulc

L'enregistrement de l'utilisateur nouvellement créé avant sign_in échouera car le périphérique n'a pas encore rempli les champs requis pour l'objet utilisateur. Le code de David fonctionnera donc pour la page en cours, mais la page suivante n'obtiendra pas l'utilisateur connecté, car l'utilisateur n'est enregistré que lorsque la session est définie. Cela se produit lorsque j'utilise Mongoid, et je ne sais pas si c'est un problème spécifique à Mongodb.

Pour résoudre ce problème, j'ai une solution très imparfaite pour appeler deux fois sign_in. Le premier sign_in sauvera l'utilisateur. Cela fonctionne, mais les gens peuvent certainement l'améliorer.

@user = User.new(:email => '[email protected]',
                 :password => 'password',
                 :password_confirmation => 'password')
# This will save the user in db with fields for devise
sign_in @user
# :bypass is set to ignore devise related callbacks and only save the
# user into session.
sign_in @user, :bypass => true 
8
vanship82

Pour les nouvelles personnes voyant cette question ...

Une façon simple de le faire est dans votre

config/routes.rb

vous devriez avoir une ligne comme celle-ci:

devise_for :users

il vous suffit donc d'ajouter un préfixe de chemin que le périphérique utilisera:

devise_for :users, :path_prefix =>'auth'

J'espère que ça aide!

4
Raúl Contreras