[RUBY] [Rails] Umgang mit URL-Änderungen nach dem Rendern

Annahme

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.

Ursache

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.

Lösungsrichtlinie

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.)

Lösungen

Verfahren

  1. Erstellen Sie Javascript
  2. Aktivieren Sie die Verwendung von Javascript in der Zielansicht (Benutzerregistrierungsansicht).
  3. Betten Sie Tags nur in die Zielansicht ein

1. Erstellen Sie eine js-Datei

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.

2. Um js zu verwenden

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.

3. Einbetten von Tags in die Ansicht

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.

Andere Referenzseiten

Recommended Posts

[Rails] Umgang mit URL-Änderungen nach dem Rendern
[Einführung in Rails] Verwendung von Render
[Android] Wie man mit dunklen Themen umgeht
So installieren Sie Pry nach dem Erstellen einer Rails-Entwicklungsumgebung mit Docker
Der Umgang mit dem Vorkompilieren von Assets ist fehlgeschlagen.
So erstellen Sie eine Rails 6-Umgebung mit Docker
So erstellen Sie eine API mit GraphQL und Rails
[Rails] So erstellen Sie eine Umgebung mit Docker
So leiten Sie nach der Benutzeranmeldung mit Spring-security um
Wie schreibe ich Rails
So deinstallieren Sie Rails
Diätprogramm mit Präprozessor (Umgang mit der Größe von i-appli)
So pushen Sie mit Rails entwickelte Apps an Github
So löschen Sie ein mit Rails erstelltes new_record-Objekt
Umgang mit Keine Vorlage für interaktive Anfragen
So generieren Sie manuell ein JWT mit Knock in Rails
[Docker-Umgebung] Umgang mit ActiveSupport :: MessageEncryptor :: InvalidMessage
[So fügen Sie ein Video mit Rails in haml ein]
Abfragen von Arrays in jsonb mit Rails + postgres
Umgang mit Fehlern in Rails s konnte keine JavaScript-Laufzeit finden.
[Schienen] Wie poste ich Bilder?
[Rails] Verwendung von Enum
[Rails] Verwendung von Enum
Wie man Schienenrouten liest
Verwendung von Rails Join
Wie man mit html.erb nummeriert (nummeriert)
So aktualisieren Sie mit activerecord-import
So beenden Sie den Rails-Server
Wie schreibe ich Rails Seed
[Rails] Verwendung der Validierung
[Schienen] So deaktivieren Sie Turbolinks
[Rails] So verwenden Sie authenticate_user!
[Rails] So implementieren Sie Scraping
[Schienen] Wie man Samen macht
Wie schreibe ich Rails Routing
[Rails] So installieren Sie simple_calendar
[Rails] So installieren Sie reCAPTCHA
[Schienen] Verwendung von Scope
So generieren Sie automatisch ein ER-Diagramm bei der Migration mit Rails 6
Festlegen von Umgebungsvariablen bei Verwendung von Payjp mit Rails
[Rails] Verschiedene Unterschiede zwischen redirect_to und Render-Methode und Ausgabemethode der Render-Methode
[Mit Backtricks] So stellen Sie React to the simple Rails vor
So geben Sie db beim Erstellen einer App mit Rails an
Umgang mit dem Fehler FEHLER: Während der Ausführung von gem ... (Gem :: FilePermissionError)
Umgang mit Bundler :: Dsl :: DSLError durch Umschreiben von gemfile
So löschen Sie das Testbild, nachdem Sie den Rspec-Test mit CarrierWave ausgeführt haben
Umgang mit verschiedenen Versionen von rbenv und Ruby