Ruby 2.5.7 Rails 5.2.4
gem gem 'devise'
Le nouveau formulaire d'enregistrement du dispositif peut être personnalisé (pas l'état par défaut)
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.
new.html.erb
) et un écran de fin ( completion.html.erb
) dans vues / utilisateurs.) après l'enregistrement de l'adhésion aux controllers (
controllers / users / registrations_controller.rb`).registrations_controller.rb
vers routes.rb
.controllers / users_controller.rb
)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.
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 est
registrations / 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.
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 par
form_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.
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.
À 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`.
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
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.
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.