Die Umgebung ist wie folgt. Mac OS Catalina 10.15.7 Ruby 2.7.1 Rails 6.0.3.3
Ich werde versuchen, es so einfach wie möglich aufzunehmen, auch als eigenes Memorandum. Das Rails-Tutorial wird hier als Beispiel verwendet, um das Problem zu veranschaulichen.
Insbesondere bei der Implementierung der Benutzerregistrierungsfunktion in Kapitel 7 ändert sich die URL von "/ signup" zu "/ users", wenn sie nach einem Registrierungsfehler aufgrund einer Validierung auf dem Formularbildschirm gerendert wird. Das Problem ist das
Die URL ändert sich von "localhost: 3000 / signup" zu "localhost: 3000 / users" → Beim erneuten Laden tritt ein Fehler auf, da die den Benutzern entsprechende Ansicht nicht erstellt wird.
Ich werde die Lösung des Problems erklären.
Wenn sich die Erstellungsaktion nicht als Benutzer registrieren lässt, bedeutet "Rendern", dass die neue Aktion nicht aufgerufen wird und nur die Ansicht gewechselt wird. Da die Erstellungsaktion / users lautet, lautet die URL nach der Aktion natürlich "/ users". Die Inkonsistenz zwischen dieser URL und dem Bildschirm ist ein Problem.
Die Lösung besteht darin, die URL mit Javascript zu ändern, ohne den Controller-Code zu ändern. Laden Sie ein bestimmtes js nur in der Zielansicht. (Wechseln Sie von "/ users" zu "/ signup", das heißt, es sieht so aus, als ob die URL auch nach der Aktion als "/ signup" festgelegt ist.)
Verfahren
Erstellen Sie die folgenden js mit einem beliebigen Verzeichnis unter app / javascript / packs oder einem beliebigen Namen direkt darunter (in diesem Fall users / signup_render.js).
app/javascript/packs/users/signup_render.js
history.replaceState('', '', '/signup')
Ich bezog mich auf Folgendes. Leicht verständliche Erklärung zu replaceState Weitere Informationen zu replaceState
Ich bearbeite den aktuellen Verlauf mit der Methode history.replaceState () und ersetze "/ users" durch "/ signup" durch den an die Methode übergebenen URL-Parameter.
Erstellen Sie eine neue Kompilierungseinstellung in app / javascript / packs / application.js
, um sie für die Zielansicht zu kompilieren.
app/javascript/packs/application.js
//↓ Originalcode
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels")
//↓ Fügen Sie dies hinzu
require("users/signup_render")
Der Pfad wird ab App / Javascript beschrieben.
Betten Sie javascript_pack_tag
in die Zielansicht ein. Im Beispiel des Tutorials ist dies der in Listing 7.20 gezeigte Benutzerregistrierungsbildschirm.
erb:app/views/users/new.html.erb
<!--Dies ist der Originalcode ↓-->
<% 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>
<!--Fügen Sie dies unten hinzu ↓-->
<% if @user.errors.any? %>
<%= javascript_pack_tag 'users/signup_render' %>
<% end %>
Die Bedingung wird in "if @ user.errors.any?" Festgelegt "Validierungsfehler tritt auf = Bitte verarbeiten Sie js nur, wenn die Benutzerregistrierung fehlschlägt und gerendert wird".
<% = javascript_pack_tag'users / signup_render '%>
bedeutet "load app / javascript / packs / users / signup_render.js
."
Ich hoffe, Sie finden das hilfreich.
Recommended Posts