Exploring Devise, Partie 2

introduction

Dans la première partie du didacticiel, nous avons appris à installer Devise et à le configurer dans notre application Rails. Dans cette partie, nous verrons comment intégrer DeviseInvitable.

DeviseInvitable est une extension qui fonctionne avec Devise. Avec DeviseInvitable dans votre application, vos utilisateurs peuvent inviter leurs amis par courrier électronique. C'est une fonctionnalité intéressante à inclure dans votre application si vous créez une application de collaboration..

Configuration de DeviseInvitable

Ouvrez votre Gemfile et ajoutez la gemme:

# Gemfile… gem 'devise_invitable'

Exécutez la commande pour installer installation groupée.

Exécutez la commande du générateur pour ajouter l'option de configuration de DeviseInvitable au fichier de configuration de Devise..

rails génèrent devise_invitable: installer

Vous pouvez voir les nouvelles modifications en vérifiant config / initializers / invent.rb avec votre éditeur de texte.

Ensuite, ajoutons DeviseInvitable à notre Utilisateur modèle.

les rails génèrent un utilisateur invitable 

Cela va ajouter le : invitable sur votre modèle, votre modèle utilisateur ressemblera à ceci:

# app / models / user.rb class Utilisateur < ActiveRecord::Base # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable and :omniauthable devise :invitable, :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable end

L'exécution de la commande ci-dessus a également généré un fichier de migration qui ressemble à ce que j'ai ci-dessous:

classe DeviseInvitableAddToUsers < ActiveRecord::Migration def up change_table :users do |t| t.string :invitation_token t.datetime :invitation_created_at t.datetime :invitation_sent_at t.datetime :invitation_accepted_at t.integer :invitation_limit t.references :invited_by, polymorphic: true t.integer :invitations_count, default: 0 t.index :invitations_count t.index :invitation_token, unique: true # for invitable t.index :invited_by_id end end def down change_table :users do |t| t.remove_references :invited_by, polymorphic: true t.remove :invitations_count, :invitation_limit, :invitation_sent_at, :invitation_accepted_at, :invitation_token, :invitation_created_at end end end

Maintenant, migrez votre base de données en exécutant rake db: migrer.

Configuration du contrôleur pour DeviseInvitable

DeviseInvitable est requis pour transmettre certains paramètres lors de l'envoi d'une invitation. Pour que cela fonctionne, nous devons inclure dans la liste blanche le paramètre nécessaire qui sera utilisé. À l'aide de votre éditeur de texte, naviguez jusqu'à app / controllers / application_controller.rb et faites ressembler le vôtre à ce que j'ai ci-dessous:

classe # app / controllers / application_controller.rb ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception before_action :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters added_attrs = [:username, :email, :password, :password_confirmation, :remember_me] devise_parameter_sanitizer.permit :sign_up, keys: added_attrs devise_parameter_sanitizer.permit :account_update, keys: added_attrs devise_parameter_sanitizer.permit :accept_invitation, keys: [:email] end end

De ce qui précède, vous pouvez voir que :email  a été ajouté à la liste blanche pour DeviseInvitable.

Voyons maintenant ce que nous avons via notre console. Sur votre terminal, lancez console de rails et entrez ce que vous avez ci-dessous.

[1] levier (principal)> User.invite! (: Email => "[email protected]")

Il devrait produire une sortie qui ressemble à celle que j'ai ci-dessous, bien qu'il y ait des différences.

[2] pry (main)> User Load (78.3ms) SELECT. "Utilisateurs". * FROM "utilisateurs" WHERE "utilisateurs". "Email" =? ORDER BY "users". "Id" ASC LIMIT 1 [["email", "[email protected]"]] User Load (0.2ms) SÉLECTIONNER les "utilisateurs". * FROM "utilisateurs". O "utilisateurs". "Invitation_token "=? ORDRE PAR "utilisateurs". "Id" ASC LIMIT 1 [["invitation_token", "658da470d5fc1fbb2275f30bc",] (0.1ms) traitement en cours "," invitation_created_at "," invitation_sent_at "," created_at "," updated_at ") VALEURS (?,?,?,?,?,?,?) [[" email "," [email protected] "], [ "encrypted_password", "2a $ 11 $ 0sLfqvfFDsebcmcQTUXzlOuqNIooL5z8niXeza8OUwNK3gZY / Irum"], [ "invitation_token", "658da470d5fcbb2275f30bc1fb66f5771b889cec2f1e56f536319d2fd1ef4a92"], [ "invitation_created_at", "07/10/2016 07: 41: 51,254047"], [ "invitation_sent_at", " 2016-10-07 07: 41: 51.254047 "], [" created_at "," 2016-10-07 07: 41: 51.255700 ", [" updated_at "," 2016-10-07 07: 41: 51.255700 "] ] (220.5ms) transaction de validation rendue /home/kinsomicrote/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/devise_invitable-1.7.0/app/views/devise/mailer/invitation_instructions. html.erb (2.5ms) rendu /home/kinsomicrote/.rbenv/versions/2.3.0/li b / ruby ​​/ gems / 2.3.0 / gems / devise_invitable-1.7.0 / app / vues / version / mailer / invitation_instructions.text.erb (88.0ms) Devise :: Mailer # invitation_instructions: courrier sortant traité en 247.1ms Envoi de courrier to [email protected] (74.3ms) Date: ven, 07 oct. 2016 08:41:51 +0100 De: [email protected] Répondre à: please-change [email protected] À: [email protected] Message-ID: <[email protected]> Objet: Instructions d'invitation Mime-Version: 1.0 Contenu-Type: multipart / alternative; borne = "- == _ mimepart_57f751bfcc725_18022ac6c272b12840524"; jeu de caractères = codage de transfert de contenu UTF-8: 7 bits ---- == _ mimepart_57f751bfcc725_18022ac6c272b12840524 contenu-type: text / plain; charset = UTF-8 Content-Transfer-Encoding: 7bit Bonjour [email protected] Quelqu'un vous a invité à http: // localhost: 3000 / /, vous pouvez l'accepter via le lien ci-dessous. http: // localhost: 3000 / users / invitation / accept? invitation_token = xmW9uRfyafptmeFMmFBy Si vous ne voulez pas accepter l'invitation, veuillez ignorer cet email. Votre compte ne sera créé que lorsque vous aurez accédé au lien ci-dessus et défini votre mot de passe. ---- == _ mimepart_57f751bfcc725_18022ac6c272b12840524 Content-Type: text / html; jeu de caractères = codage de transfert de contenu UTF-8: 7 bits 

Bonjour [email protected]

Quelqu'un vous a invité à http: // localhost: 3000 /, vous pouvez l'accepter via le lien ci-dessous.

Accepter l'invitation

Si vous ne voulez pas accepter l'invitation, veuillez ignorer cet email..
Votre compte ne sera créé que lorsque vous aurez accédé au lien ci-dessus et défini votre mot de passe..

----== _ mimepart_57f751bfcc725_18022ac6c272b12840524-- => # [3] levier (principal)>

Cela a fonctionné comme prévu.

Vous ne voulez pas que nos utilisateurs envoient des invitations via la ligne de commande. Il est donc important de configurer DeviseInvitable pour qu'il fonctionne en mode frontal. Faire cela est très simple. exécutez la commande generator pour générer les vues pour DeviseInvitable.

rails genèrent devise_invitable: affiche les utilisateurs

Vous devrez également ajouter un lien quelque part dans votre application qui pointe vers la page d’envoi des invitations (app / views / utilisateurs / invitations / new.html.erb).

Pour cette application, vous pouvez continuer et ajouter le lien à votre fichier de navigation. Voici comment j'ai fait le mien:

# app / views / shared / _navigation.html.erb 

Pour voir les routes mises à disposition par DeviseInvitable, exécutez la commande itinéraires de rake | inviter. Voici à quoi ressemblera la sortie.

cancel_user_registration GET /users/cancel(.:format) devise_invitable / registrations # cancel utilisateur_registration POST / utilisateurs / = (forme)) imagine_invitable / registrations # crée new_user_registration GET /users/sign_up(.:format) /edit(.:format) devise_invitable / registration # éditer PATCH /users(.:format) devise_invitable / registration # mettre à jour PUT /users(.:format) inventaire_invitable / registration # mise à jour DELETE /users(.:format) devise_invitable / inscriptions # détruire accept_user_invitation GET /users/invitation/accept(.:format) concevez / invitations # modifier remove_user_invitation GET /users/invitation/remove(.:format) concevez / invitations # détruisez user_invitation POST / users/invitation/remove(.:format) invitations # create new_user_invitation GET /users/invitation/new(.:format) concevez / invitations # new PATCH /users/invitation(.:format) concevez / invitations # update PUT /users/invitation(.:format) concevez / invitations # mettre à jour

Voyons ce que nous avons en ce moment. Exécutez la commande pour démarrer votre serveur. serveur de rails.

Pointez votre navigateur sur http: // localhost: 3000 / users / invitation / new. Entrez une adresse e-mail dans le formulaire indiqué et cliquez sur le bouton. Cela devrait fonctionner! Si vous consultez les journaux de votre serveur, vous devriez voir une sortie créée lors de l'envoi de l'invitation. Dans la sortie, vous verrez un lien pour accepter l'invitation.

Vous conviendrez avec moi que ce sera mieux si vous pouvez voir le courrier électronique envoyé dans votre navigateur. Voyons comment faire ce travail.

Intégration de Letter_Opener

Ouvre-lettre vous permet de prévisualiser les emails dans votre navigateur par défaut. Avec celui-ci, vous n'avez pas besoin de configurer un système de distribution du courrier lorsque vous travaillez dans l'environnement de développement..

Ouvrez votre Gemfile et ajoutez la gemme ci-dessous:

bijou 'letter_opener'

Courir installation groupée.

À l'aide de votre éditeur de texte, naviguez jusqu'à config / environnements / développement.rb et ajoutez la ligne ci-dessous.

# config / environment / development.rb… config.action_mailer.delivery_method =: letter_opener end

Redémarrez votre serveur rails. Maintenant, pointez votre navigateur sur http: // localhost: 3000 / users / invitation / new. Remplissez et envoyez le formulaire affiché. Cette fois-ci, une nouvelle page apparaît contenant le courrier électronique d'invitation..

Modifier les itinéraires de connexion et de déconnexion par défaut

Par défaut, le se connecter et Déconnexion Les routes lors de l’utilisation de Devise ressemblent à ceci:

se connecter: http: // localhost: 3000 / users / sign_in

Déconnexion: http: // localhost: 3000 / users / sign_out

Pour le changer, allez à config / routes.rb et ajoutez ce qui suit:

# config / routes.rb en tant que: l'utilisateur obtient 'signin' => 'devise / sessions # nouveau' post 'connexion' => 'devise / sessions # crée' delete 'signout' => 'devise / sessions # détruit' fin

Vous pouvez diriger votre navigateur vers http: // localhost: 3000 / signin.

Conclusion

Vous savez maintenant comment utiliser DeviseInvitable. Vous avez également appris sur le joyau ouvre-lettre. Devise vous permet de faire beaucoup de choses, alors consultez le wiki pour en savoir plus. Merci de rester avec moi.