L'environnement est le suivant. Mac OS Catalina 10.15.7 Ruby 2.7.1 Rails 6.0.3.3
J'essaierai de l'enregistrer aussi facilement que possible, également en tant que mémorandum de ma part. Le tutoriel Rails est utilisé ici comme exemple pour illustrer le problème.
Plus précisément, lors de la mise en œuvre de la fonction d'enregistrement des utilisateurs au chapitre 7, l'URL passera de «/ signup» à «/ users» lorsqu'elle sera rendue sur l'écran du formulaire après l'échec de l'enregistrement en raison de la validation. Le problème, c'est
L'URL passe de localhost: 3000 / signup
à localhost: 3000 / users
→ Une erreur se produit lors du rechargement car la vue correspondant aux utilisateurs n'est pas créée.
J'expliquerai la solution au problème.
Lorsque l'action de création ne parvient pas à s'enregistrer en tant qu'utilisateur, «render'new» signifie que la nouvelle action n'est pas appelée et que seule la vue est commutée.
Puisque l'action de création est / users, l'URL sera naturellement / users
après l'action.
L'incohérence entre cette URL et l'écran est un problème.
La solution est de changer l'URL avec javascript sans changer le code du contrôleur. Chargez un js spécifique uniquement dans la vue cible.
(Passer de / users
à / signup
, c'est-à-dire qu'il semble que l'URL soit fixée comme / signup
même après l'action.)
procédure
Créez les js suivants avec n'importe quel répertoire sous app / javascript / packs ou n'importe quel nom directement en dessous (users / signup_render.js dans ce cas).
app/javascript/packs/users/signup_render.js
history.replaceState('', '', '/signup')
J'ai évoqué ce qui suit. Explication facile à comprendre sur replaceState En savoir plus sur replaceState
Je modifie l'historique actuel avec la méthode history.replaceState () et remplace / users
par / signup
par le paramètre d'URL passé à la méthode.
Créez un nouveau paramètre de compilation dans ʻapp / javascript / packs / application.js` pour compiler pour la vue cible.
app/javascript/packs/application.js
//↓ Code d'origine
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
//↓ Ajouter ceci
require("users/signup_render")
Le chemin est décrit à partir de app / javascript.
Incorporez javascript_pack_tag
dans la vue cible. Dans l'exemple du didacticiel, il s'agit de l'écran d'enregistrement de l'utilisateur présenté dans l'extrait 7.20.
erb:app/views/users/new.html.erb
<!--Ceci est le code d'origine ↓-->
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<div class="row">
<div class="col-md-6 col-md-offset-3">
<%= form_with(model: @user, local: true) do |f| %>
<%= render 'shared/error_messages' %>
<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>
<%= f.label :email %>
<%= f.email_field :email, class: 'form-control' %>
<%= f.label :password %>
<%= f.password_field :password, class: 'form-control' %>
<%= f.label :password_confirmation, "Confirmation" %>
<%= f.password_field :password_confirmation, class: 'form-control' %>
<%= f.submit "Create my account", class: "btn btn-primary" %>
<% end %>
</div>
</div>
<!--Ajoutez ceci ci-dessous ↓-->
<% if @user.errors.any? %>
<%= javascript_pack_tag 'users/signup_render' %>
<% end %>
ʻSi @ user.errors.any? `Définit la condition "Une erreur de validation se produit = Veuillez traiter js uniquement lorsque l'enregistrement de l'utilisateur échoue et est rendu".
<% = javascript_pack_tag'users / signup_render '%>
signifie "charger ʻapp / javascript / packs / users / signup_render.js`."
J'espère que ça t'as aidé.
Recommended Posts