[RAILS] J'ai essayé d'implémenter la fonction similaire par communication asynchrone

ajax.gif

introduction

De nombreux articles ont déjà été publiés, mais j'aimerais les rédiger comme un mémorandum de ma part.

Avantages de la communication asynchrone

En apprenant personnellement "pourquoi la technologie est utilisée" en premier lieu, Je pense que c'est rapide à comprendre car le but est clair.

1. Seule une partie de la page peut être mise à jour sans changer la page.

Pour être honnête, je pense que c'est assez ennuyeux si la page est modifiée à chaque fois que vous l'aimez. Cependant, en utilisant la communication asynchrone, vous pouvez commenter, aimer et modifier les utilisateurs sans passer par les transitions __page! __

La mise en oeuvre!

Étape ① Envoyez une demande de format JS au serveur

Premièrement, s'il ne s'agit pas d'une communication asynchrone, le terminal au moment de l'exécution similaire se comporte comme suit. スクリーンショット 2020-10-29 17.03.56.png Le format de la demande est affiché dans la partie du cercle rouge de l'image. Dans ce cas, cela signifie que la communication est au format HTML!

Je veux mettre ça au format JS ...!

views:_favorites.html.erb


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

De cette façon, vous pouvez envoyer une demande de format JS en ajoutant remote: true au lien du bouton like. スクリーンショット 2020-10-29 17.15.15.png

Étape ② Créez un modèle partiel pour le bouton similaire

Afin de mettre en œuvre une communication asynchrone, les modifications doivent être des modèles partiels. Plus précisément, préparez une boîte "j'aime" que vous souhaitez mettre à jour partiellement, C'est une image qui change l'affichage selon que vous l'aimez ou non.

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">Aimez-le</span>
    <% end %>
  <% else %>
    <%= link_to post_favorites_path(post), method: :POST, remote: true do %>
      <span class="btn btn-primary">Comme</span>
    <% end %>
  <% end %>

Créez un modèle partiel views / posts / _favorites.html.erb, Déplacez la partie bouton similaire ici. Appelez ensuite le modèle partiel créé précédemment dans le fichier index.html d'origine.

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 %>

         <!--↓ Ajouter(Où vous souhaitez mettre à jour partiellement)↓ -->
          <div id="favorite-<%= post.id %>">
             <%= render 'posts/favorites', post: post %>
          </div>
         <!--↑ Jusqu'ici ↑-->
        </div>
  <% end %>
</div>

Étape ③ Créez un fichier js.erb

Pour les demandes au format HTML, le fichier de vue est views / nom du contrôleur / nom de l'action.html.erb Appelez le fichier de.

Cependant, pour les demandes au format JS, views / nom du contrôleur / nom de l'action.js.erb Appelez le fichier de.

Cette fois, j'implémente la fonction similaire en utilisant les actions de création et de destruction du contrôleur de favoris. views / favoris / create.js.erb et views / favoris / destroy.js.erb Créez un fichier.

ruby:views/favorites/create.js.erb


 #id="favorite-<%= @post.id %>"C'est un processus pour mettre à jour partiellement uniquement le HTML de cette partie avec rendu
$("#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 ) %>");

Étape ④ Supprimer la redirection du contrôleur

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 #← Supprimer cette ligne
    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 #← Supprimer cette ligne
    end

Achevée!

Avec la procédure ci-dessus, vous pouvez implémenter la désynchronisation de la fonction similaire!

référence

Ajax (communication asynchrone) est résumé avec un accent sur la compréhensibilité (avec une démo utilisant Rails)

Recommended Posts

J'ai essayé d'implémenter la fonction similaire par communication asynchrone
J'ai essayé d'implémenter le modèle Iterator
J'ai essayé d'implémenter le traitement Ajax de la fonction similaire dans Rails
J'ai essayé d'implémenter la fonction de prévisualisation d'image avec Rails / jQuery
J'ai essayé de connecter le compteur de points à la plate-forme MZ par communication série
J'ai essayé d'implémenter la méthode de division mutuelle d'Eugrid en Java
[Rails] J'ai implémenté le message d'erreur de validation avec une communication asynchrone!
J'ai essayé d'expliquer la méthode
J'ai essayé de construire l'environnement petit à petit en utilisant docker
[Java] J'ai essayé de faire un labyrinthe par la méthode de creusage ♪
J'ai essayé de résumer les méthodes utilisées
J'ai essayé de résumer l'API Stream
J'ai essayé d'utiliser Selenium comme JQuery
J'ai essayé d'implémenter des relations polymorphes à Nogizaka.
[Rails] J'ai essayé de faire passer la version de Rails de 5.0 à 5.2
J'ai essayé d'organiser la session en Rails
Fonction de publication implémentée par communication asynchrone dans Rails
Comment mettre en œuvre la fonction de chapelure avec Gretel
[Pour les débutants] Comment implémenter la fonction de suppression
J'ai essayé de configurer tomcat pour exécuter le servlet.
J'ai essayé d'implémenter un serveur en utilisant Netty
Mode API Rails J'ai essayé d'implémenter la fonction de recherche multiple par mot-clé à l'aide de tableaux et d'un traitement itératif.
J'ai essayé d'implémenter une fonction équivalente à Felica Lite avec HCE-F d'Android
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé d'utiliser la fonction Server Push de Servlet 4.0
J'ai essayé d'implémenter TCP / IP + BIO avec JAVA
J'ai essayé d'implémenter la notification push Firebase en Java
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
J'ai essayé de créer une fonction de connexion avec Java
J'ai essayé d'implémenter Sterling Sort avec Java Collector
[Java] J'ai essayé de mettre en œuvre la recherche de produits de l'API Yahoo
Je souhaite ajouter une fonction de suppression à la fonction de commentaire
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
J'ai essayé d'augmenter la vitesse de traitement avec l'ingénierie spirituelle
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
J'ai essayé de résumer les bases de kotlin et java
Je souhaite implémenter une fonction d'édition des informations produit ~ part1 ~
J'ai brièvement résumé la grammaire de base de Ruby
[Rails] J'ai essayé d'implémenter le traitement par lots avec la tâche Rake
J'ai essayé de créer un environnement de WSL2 + Docker + VSCode
J'ai essayé le problème FizzBuzz
J'ai essayé de développer la fonction de cache d'Application Container Cloud Service dans l'environnement local