[RAILS] Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren

ajax.gif

Einführung

Viele Artikel wurden bereits veröffentlicht, aber ich möchte sie als eigenes Memorandum schreiben.

Vorteile der asynchronen Kommunikation

Indem Sie zuerst persönlich lernen, "warum die Technologie verwendet wird", Ich habe das Gefühl, dass es schnell zu verstehen ist, weil der Zweck klar ist.

1. Nur ein Teil der Seite kann aktualisiert werden, ohne die Seite zu ändern.

Um ehrlich zu sein, finde ich es ziemlich ärgerlich, wenn die Seite jedes Mal geändert wird, wenn Sie es mögen. Durch die Verwendung der asynchronen Kommunikation können Sie jedoch Benutzer kommentieren, mögen und bearbeiten, ohne __Seitenübergänge zu durchlaufen! __ __

Implementierung!

Schritt ① Senden Sie eine JS-Formatanforderung an den Server

Erstens, wenn es sich nicht um eine asynchrone Kommunikation handelt, verhält sich das Terminal zum Zeitpunkt der gleichen Ausführung wie folgt. スクリーンショット 2020-10-29 17.03.56.png Das Anforderungsformat wird im roten Kreis des Bildes ausgegeben. In diesem Fall bedeutet dies, dass die Kommunikation im HTML-Format erfolgt!

Ich möchte dies in das JS-Format bringen ...!

views:_favorites.html.erb


<%= link_to post_favorites_path(post), method: :DELETE, remote: true do %>

Auf diese Weise können Sie eine JS-Formatanforderung senden, indem Sie remote: true zum Link der Schaltfläche "Gefällt mir" hinzufügen. スクリーンショット 2020-10-29 17.15.15.png

Schritt ② Erstellen Sie eine Teilvorlage für die Schaltfläche "Gefällt mir"

Um eine asynchrone Kommunikation zu implementieren, müssen die Änderungen Teilvorlagen sein. Bereiten Sie insbesondere ein "Gefällt mir" -Box vor, das Sie teilweise aktualisieren möchten. Es ist ein Bild, das die Anzeige wechselt, je nachdem, ob es Ihnen gefällt oder nicht.

views:views/posts/_favorites.html.erb


  <% if post.favorited_by?(current_user) %>
    <%= link_to post_favorites_path(post), method: :DELETE, remote: true do %>
      <span class="btn btn-danger">Mag es aus</span>
    <% end %>
  <% else %>
    <%= link_to post_favorites_path(post), method: :POST, remote: true do %>
      <span class="btn btn-primary">Mögen</span>
    <% end %>
  <% end %>

Erstellen Sie eine Teilvorlage views / posts / _favorites.html.erb, Verschieben Sie den Like-Button-Teil hierher. Rufen Sie dann die Teilvorlage auf, die zuvor in der ursprünglichen index.html erstellt wurde.

views:views/posts/index.html.erb


<div class="main_contents">
    <% @posts.each do |post| %>
        <div class="post_contents">
          <h2><%= link_to post.title, post_path(post.id) %></h2>
          <%= post.content %>

         <!--↓ Hinzufügen(Wo Sie teilweise aktualisieren möchten)↓ -->
          <div id="favorite-<%= post.id %>">
             <%= render 'posts/favorites', post: post %>
          </div>
         <!--↑ Bis hierher ↑-->
        </div>
  <% end %>
</div>

Schritt ③ Erstellen Sie eine js.erb-Datei

Bei Anforderungen im HTML-Format lautet die Ansichtsdatei views / Controller-Name / Aktionsname.html.erb Rufen Sie die Datei von auf.

Für JS-Formatanforderungen muss jedoch views / controller name / action name.js.erb Rufen Sie die Datei von auf.

Dieses Mal implementiere ich die Like-Funktion mithilfe der Aktionen zum Erstellen und Zerstören des Favoriten-Controllers. views / Favoriten / create.js.erb und views / Favoriten / destroy.js.erb Erstellen Sie eine Datei.

ruby:views/favorites/create.js.erb


 #id="favorite-<%= @post.id %>"Es ist ein Prozess, nur den HTML-Code dieses Teils teilweise mit Render zu aktualisieren
$("#favorite-<%= @post.id %>").html("<%= j(render 'posts/favorites',  post: @post ) %>");

ruby:views/favorites/destroy.js.erb


$("#favorite-<%= @post.id %>").html("<%= j(render 'posts/favorites',  post: @post ) %>");

Schritt ④ Löschen Sie die Controller-Umleitung

controllers/favorites_controller.rb


    def create
      @post = Post.find(params[:post_id])
      favorite = current_user.favorites.build(post_id: @post.id)
      favorite.save
      redirect_to root_path #← Lösche diese Zeile
    end

    def destroy
      @post = Post.find(params[:post_id])
      favorite = current_user.favorites.find_by(post_id: @post.id)
      favorite.destroy
      redirect_to root_path #← Lösche diese Zeile
    end

Komplett!

Mit dem obigen Verfahren können Sie eine Desynchronisation der gleichen Funktion implementieren!

Referenz

Ajax (asynchrone Kommunikation) wird mit Schwerpunkt auf Verständlichkeit zusammengefasst (mit einer Demo mit Rails)

Recommended Posts

Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
Ich habe versucht, das Iterator-Muster zu implementieren
Ich habe versucht, die Ajax-Verarbeitung der ähnlichen Funktion in Rails zu implementieren
Ich habe versucht, die Bildvorschau mit Rails / jQuery zu implementieren
Ich habe versucht, den Punktzähler durch serielle Kommunikation mit der MZ-Plattform zu verbinden
Ich habe versucht, die Methode der gegenseitigen Teilung von Eugrid in Java zu implementieren
[Rails] Ich habe die Validierungsfehlermeldung mit asynchroner Kommunikation implementiert!
Ich habe versucht, die Methode zu erklären
Ich habe versucht, die Umgebung nach und nach mit Docker aufzubauen
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, die verwendeten Methoden zusammenzufassen
Ich habe versucht, die Stream-API zusammenzufassen
Ich habe versucht, Selen wie JQuery zu verwenden
Ich habe versucht, polymorph in Nogizaka zu implementieren.
[Rails] Ich habe versucht, die Version von Rails von 5.0 auf 5.2 zu erhöhen
Ich habe versucht, die Sitzung in Rails zu organisieren
Buchungsfunktion implementiert durch asynchrone Kommunikation in Rails
So implementieren Sie die Brotkrumenfunktion mit gretel
[Für Anfänger] So implementieren Sie die Löschfunktion
Ich habe versucht, Tomcat so einzustellen, dass das Servlet ausgeführt wird.
Ich habe versucht, einen Server mit Netty zu implementieren
Rails-API-Modus Ich habe versucht, die Mehrfachsuchfunktion für Schlüsselwörter mithilfe von Arrays und iterativer Verarbeitung zu implementieren.
Ich habe versucht, mit HCE-F von Android eine Funktion zu implementieren, die Felica Lite entspricht
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Ich habe versucht, die Server-Push-Funktion von Servlet 4.0 zu verwenden
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
Ich habe versucht, die Firebase-Push-Benachrichtigung in Java zu implementieren
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
[Java] Ich habe versucht, die Yahoo API-Produktsuche zu implementieren
Ich möchte der Kommentarfunktion eine Löschfunktion hinzufügen
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit spiritueller Technik zu erhöhen
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich möchte eine Produktinformationsbearbeitungsfunktion ~ part1 ~ implementieren
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
[Rails] Ich habe versucht, die Stapelverarbeitung mit der Rake-Task zu implementieren
Ich habe versucht, eine Umgebung mit WSL2 + Docker + VSCode zu erstellen
Ich habe das FizzBuzz-Problem ausprobiert
Ich habe versucht, die Cache-Funktion von Application Container Cloud Service in der lokalen Umgebung zu entwickeln