[RUBY] [Rails] Ajoutez un écran de confirmation et un écran de fin pour concevoir l'inscription des membres.

environnement

Ruby 2.5.7 Rails 5.2.4

gem gem 'devise'

supposition

Le nouveau formulaire d'enregistrement du dispositif peut être personnalisé (pas l'état par défaut)

Chose que tu veux faire

Dans la configuration par défaut du périphérique, lorsque les informations sont saisies et envoyées sur la page d'inscription, elles seront enregistrées telles quelles et passeront à la page prédéfinie (désignée). Je pense que ce serait plus gentil s'il y avait une page où vous pouvez vérifier les informations saisies avant l'inscription, ou une page vous informant que l'inscription est terminée, donc cette fois, en plus du "formulaire de saisie", "entré" Nous créerons un "écran de confirmation des informations" et un "écran de fin d'inscription". Quant au flux de pages complété par cette création, Formulaire de saisie des informations sur les nouveaux membres ʻusers / new.html.erb (nouvelle création) → Écran de confirmation des informations d'entrée ʻusers / registrations / new.html.erb → Écran de fin d'inscription ʻusers / completion (nouvelle création)` L'écran changera dans l'ordre.

Cela peut sembler un peu étrange, mais ʻusers / registrations / new.html.erb` fourni par devise ne fait que confirmer les informations saisies sur la page précédente, et il semble qu'elles aient été saisies sur la page précédente. Il affiche simplement la valeur qui a été donnée.

procédure

  1. Préparez un écran de saisie (new.html.erb) et un écran de fin ( completion.html.erb) dans vues / utilisateurs.
  2. Ajoutez la destination de la redirection (ʻusers / completion.html.erb) après l'enregistrement de l'adhésion aux controllers (controllers / users / registrations_controller.rb`).
  3. Ajout du routage du fichier de vue ajouté en 1. et de l'utilisation de registrations_controller.rb vers routes.rb.
  4. Créez un nouveau et une complétion pour le rendu dans (controllers / users_controller.rb)

1. Création de l'écran de confirmation et de l'écran de fin

Comme mentionné au début, le flux de l'écran au moment du nouvel enregistrement est Nouveau formulaire de saisie d'inscription ʻusers / new.html.erb → Écran de confirmation d'entrée ʻusers / registrations / new.html.erb → Écran de fin d'inscription ʻusers / completion`. Si vous appuyez sur le bouton "Enregistrer" sur l'écran de confirmation, les informations utilisateur seront enregistrées en utilisant la fonction standard du périphérique.

écran de saisie

erb:users/new.html.erb


<div>

  <h2>Inscription des nouveaux membres</h2>

  <%= form_with url: new_user_registration_path, method: :get, local: true do |f| %>

    <%= f.label :name %>
    <%= f.text_field :name %>

    <%= f.label :phone_number %>
    <%= f.number_field :phone_number %>

    <%= f.label :email %>
    <%= f.email_field :email %>

    <%= f.label :password %>
    <% if @minimum_password_length %>
      (<%= @minimum_password_length %>Plus que des lettres)
    <% end %>

    <%= f.password_field :password %>
    <%= f.password_field :password_confirmation %>

    <%= render "users/shared/links" %>

    <%= f.submit "Vérification" %>
  <% end %>
</div>

Créez-en un nouveau en vous référant au formulaire registrations / new.html.erb initialement préparé. J'omettrai comment ajouter des informations sur le nom et le numéro de téléphone aux informations d'enregistrement. Si vous souhaitez l'ajouter, veuillez d'abord le définir et vérifier le fonctionnement, puis essayez cette méthode, ou essayez avec les paramètres par défaut (adresse e-mail, mot de passe uniquement) sans augmenter le nombre de colonnes.

Le point est la balise de formulaire.

erb:users/new.html.erb



  ...

  <%= form_with url: new_user_registration_path, method: :get, local: true do |f| %>

    ...

  <% end %>

Ici, le modèle à enregistrer n'est pas spécifié, seule l'url est spécifiée. En d'autres termes, lorsqu'elle est soumise dans le formulaire, la transition est effectuée vers l'url spécifiée ici, et la valeur saisie dans le formulaire est également transmise à la destination de la transition en tant que "paramètre". Pour l'url spécifiée ici, spécifiez ʻurl: new_user_registration_pathsur l'écran de confirmation suivant. Cette url estregistrations / new.html.erb` fournie par défaut par devise.

La méthode HTTP spécifie "GET" au lieu de "POST" car ce formulaire ne transforme que l'url. La méthode HTTP du formulaire est par défaut "POST", vous devez donc spécifier method :: get.

La balise form utilisée cette fois est form_with. Puisque la méthode de transmission par défaut de form_with est Ajax ( remote: true) et que la transition d'écran n'est pas effectuée, il est également nécessaire de spécifier local: true. Dans le cas de form_for, la valeur par défaut est local: true, donc vous n'avez généralement pas besoin d'en être conscient.

écran de confirmation

erb:users/registration/new.html.erb


<div>

  <h2>Confirmation des informations d'entrée</h2>

  <%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>

    <p><%= params[:name] %></p>
    <p><%= params[:phone_number] %></p>
    <p><%= params[:email] %></p>
    <p><%= @password %></p>

    <%#Paramètres à envoyer réellement%>
    <%= f.hidden_field :name, value: params[:name] %>
    <%= f.hidden_field :phone_number, value: params[:phone_number] %>
    <%= f.hidden_field :email, value: params[:email] %>
    <%= f.hidden_field :password, value: params[:password] %>

    <%= f.submit "s'inscrire" %>

  <% end %>
</div>

Cet écran est ʻusers / registrations / new.html.erbpréparé par devise. À l'origine, cette page a un formulaire de saisie, mais cette fois c'est juste une confirmation, donc je ne montrerai pas le formulaire. Les balises de formulaire d'origine commençant parform_for` sont utilisées telles quelles.

Récupérez les paramètres passés de la page précédente en utilisant params [: name] etc. et affichez-les pour confirmation.

Puisque <p> <% = @ password%> </ p> aveugle le mot de passe, les params [: password] passés de la page précédente sont traités en premier côté contrôleur. La méthode de mise en aveugle est la suivante. (Bien qu'il soit listé dans les paramètres, je ne savais pas comment le cacher ici, donc j'apprécierais que vous puissiez m'apprendre une personne détaillée.)

users/registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController

  ...

  #Décommentez la nouvelle action et ajoutez le super ci-dessus
  def new
    i = 0
    @password = ""
    while i < params[:password].length
      @password += "*"
      i += 1
    end
    super
  end

  ...

end

J'obtiens le nombre de caractères dans le mot de passe avec params [: password] .length. Avec while i <params [: password] .length ... end, ʻicompte par 1 dans le processus. En même temps, "*"est ajouté à la variable@ password = ""qui a été définie juste avant, et le processus se termine lorsque le nombre de caractères est atteint. Affichez ensuite le contenu de la variable <% = @ password%> dans la vue.

super signifie que les paramètres de Devise :: RegistrationsController sont hérités tels quels, et sans cette description, resource et resource_name dans form_for ne peuvent pas être utilisés, donc veillez à ne pas les supprimer. ..

erb:users/registration/new.html.erb


<%= f.hidden_field :name_family, value: params[:name] %>
...

f.hidden_field n'est pas affiché, mais la valeur: params [: nom] qui y est spécifiée est soumise sous forme de formulaire. Dans ce formulaire, le modèle à sauvegarder est également spécifié (le modèle est automatiquement spécifié par resource), donc la valeur spécifiée par this f.hidden_field sera la valeur à sauvegarder telle quelle.

Écran de fin

erb:users/completion.html.erb


<div>
  <% if request.referrer.include?('users/sign_up') %>
    <p>L'inscription est terminée!</p>
  <% else %>
    <p>déjà utilisé.</p>
  <% end %>
</div>

Si vous appuyez sur S'inscrire sur la page précédente, les informations de membre confirmées seront enregistrées et vous serez redirigé vers cet écran en même temps.

Vous pouvez utiliser request.referrer pour obtenir l'URL de la page précédente à partir de laquelle vous vous êtes déplacé ici. La méthode include? De request.referrer.include? ('Users / sign_up') est une méthode qui retourne si la valeur entre () y est incluse ou non. Ici, nous déterminons si ʻusers / sign_up était inclus dans l'URL de la page précédente et changeons le texte affiché sur cette page. ʻSi la transition provient d'un autre que users / registrations / new.html.erb, elle sera affichée comme enregistrée, et si vous essayez de l'afficher si elle n'est pas enregistrée (non connectée) en premier lieu, imaginez before_action: authenticate_user! La page sera redirigée.

2. Ajoutez nouveau et complétion à users_controller.rb

À l'étape précédente, vous avez créé un fichier de vue, mais vous ne pouvez pas afficher l'écran tel quel, vous devez donc décrire l'action sur le contrôleur.

users_controller.rb


class UsersController < ApplicationController

  before_action :authenticate_user!, except: %i[new]

  ...

  def new
  end

  def completion
  end

  ...

end

Puisque la nouvelle page est un nouveau formulaire d'inscription de membre, il est nécessaire de décrire comme suit. before_action :authenticate_user!, except: %i[new] before_action :authenticate_user!, except: [:new] before_action :authenticate_user!, except: :new Ils ont tous la même signification, mais lorsque vous écrivez plus d'actions, le code devient plus court sur la première ligne.

Au fait, lorsque vous en spécifiez plusieurs avec % i, séparez-les simplement par un espace comme before_action: authenticate_user!, Sauf:% i [nouvelle action1 action2 action3].

Si vous ne vous êtes pas connecté, vous voulez rediriger la complétion, donc ne l'incluez pas dans ʻexcept`.

3. Décrivez la vue nouvellement créée et users / registrations_controller.rb dans routes.rb

routes.rb


Rails.application.routes.draw do

  ...

  # registrations_controller.Activez rb.
  devise_for :users, controllers: {
    ...
    registrations: 'users/registrations'
  }

  #Utilisateurs créés/new.html.erb et utilisateurs/completion.html.Ajoutez erb au routage.
  resources :users, only: %i[new] do
    get 'completion', to: 'users#completion'
  end

end

4. Modifiez la destination de la redirection après l'enregistrement

Lorsque Register est pressé sur l'écran de confirmation, il est nécessaire de passer à ʻusers / completion.html.erb` préparé à l'étape précédente.

users/registrations_controller.rb


class Users::RegistrationsController < Devise::RegistrationsController

  ...

  def after_sign_up_path_for(resource)
    user_completion_path(resource)
  end

  ...

end

Je pense que la destination de la redirection est la page par défaut ou éventuellement une autre page, mais définissez ce chemin sur ʻuser_completion_path (ressource) `(chemin des utilisateurs / completion.html.erb) créé à l'étape précédente. Je vais.

Résumé

Pour une utilisation plus pratique, j'ai publié le fichier que j'utilise actuellement sur mon GitHub, j'espère donc que vous pourrez vous y référer également! GitHub - MasaoSasaki/matchi

Si vous avez des questions, des différences d'interprétation ou si vous pensez que quelque chose ne va pas avec la méthode de description, nous vous serions reconnaissants de bien vouloir le signaler dans les commentaires.

Merci d'avoir lu jusqu'au bout.

Recommended Posts

[Rails] Ajoutez un écran de confirmation et un écran de fin pour concevoir l'inscription des membres.
[Rails] Ajouter une colonne à concevoir
[Rails] Ajoutez des paramètres forts pour concevoir
[Rails] [Note] Quand ajouter = à <%%> et quand pas
[Rails] Introduisez un calendrier simple et insérez un "écran de confirmation" dans les événements supplémentaires
[Rails] Comment créer une table, ajouter une colonne et changer le type de colonne
Implémentez un système de réservation utilisant des Rails et un calendrier simple! Ajoutons la validation à datetime!
[Rails] Comment modifier et personnaliser les vues et les contrôleurs de conception
[Rails] Traitement après l'ajout d'une colonne à la table de devise
Ajouter une ombre au bouton Swift (et aussi au cercle)
Implémenter la fonction d'enregistrement des utilisateurs et la fonction d'enregistrement de l'entreprise séparément dans Rails concevoir
[Rails 6] Comment créer un écran de saisie de formulaire dynamique à l'aide de cocoon
Je veux ajouter un appareil dans Rails, mais je ne peux pas grouper l'installation
[Attention !!] Précautions lors de la conversion de la devise Rails et de l'affichage des fichiers en haml
[Rails 5] Comment afficher l'écran de changement de mot de passe lors de l'utilisation de l'appareil
[Rails] Comment utiliser la "devise" des gemmes
Ajoutez une fonction de recherche dans Rails.
Préparation à la création de l'application Rails
[rails] Implémentation de l'écran de connexion dans la devise
[Rails] Comment empêcher la transition d'écran
[Rails] Comment ajouter de nouvelles pages
Comment créer un écran de démarrage
[Rails] "Entrée" -> "Écran de confirmation" -> "Enregistrer" -> "Afficher"
Comment mettre à jour les modifications utilisateur dans Rails Devise sans entrer de mot de passe
[Rails 6] cocoon_ Ajouter des attributs d'identifiant et de données au formulaire à ajouter