"Comment implémenter une fonction similaire dans Rails"  a présenté comment implémenter une fonction similaire, mais cette fois Vous montrera comment implémenter Ajax (communication asynchrone).
Le système terminé ressemble à ce qui suit.

Ajoutez remote: true </ b> aux deux link_to (method :: delete et method: post). En décrivant remote: true, le traitement en Ajax peut être exécuté.
html:index.html.erb
<div class="container">
  <h1>Liste des articles</h1>
  <table class="table">
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.title %></td>
        <td>
          <% if post.liked_by?(current_user) %>
            <% like = Like.find_by(user_id: current_user.id, post_id: post.id) %>
            <%= link_to like_path(like), method: :delete, remote: true do %>
              <span class="glyphicon glyphicon-heart" aria-hidden="true" style="color: red;">
              <span><%= post.likes.count %></span>
            <% end %>
          <% else %>
            <%= link_to post_likes_path(post), method: :post, remote: true do %>
              <span class="glyphicon glyphicon-heart" aria-hidden="true" style="color: gray;">
              <span><%= post.likes.count %></span>
            <% end %>
          <% end %>
        </td>
      </tr>
    <% end %>
  </table>
</div>
Créez le fichier suivant dans le même répertoire que index.html.erb, copiez et collez la partie fonction similaire.
html:_like.html.erb
<% if post.liked_by?(current_user) %>
  <% like = Like.find_by(user_id: current_user.id, post_id: post.id) %>
  <%= link_to like_path(like), method: :delete, remote: true do %>
    <span class="glyphicon glyphicon-heart" aria-hidden="true" style="color: red;">
    <span><%= post.likes.count %></span>
  <% end %>
<% else %>
  <%= link_to post_likes_path(post), method: :post, remote: true do %>
    <span class="glyphicon glyphicon-heart" aria-hidden="true" style="color: gray;">
    <span><%= post.likes.count %></span>
  <% end %>
<% end %>
Afin d'appeler le modèle partiel (_like.html.erb), écrivez render </ b> là où il y avait une partie fonction similaire. Décrivez également l'ID afin de pouvoir identifier la partie où Ajax est traité.
html:index.html.erb
<div class="container">
  <h1>Liste des articles</h1>
  <table class="table">
    <% @posts.each do |post| %>
      <tr>
        <td><%= post.title %></td>
        <td id="like-<%= post.id %>">  <!--Rendez-le identifiable par identifiant-->
       <%= render "like", post: post %>  <!--Appeler un modèle partiel avec rendu-->
        </td>
      </tr>
    <% end %>
  </table>
</div>
J'avais l'habitude de faire redirect_back à la fin de chaque action, mais quand je fais redirect_back, cela se recharge et Ajax ne fonctionne pas. Par conséquent, supprimez redirect_back.
likes_controller.rb
  def create
    like = Like.new(user_id: current_user.id, post_id: params[:post_id])
    @post = like.post
    like.save
  end
  def destroy
    like = Like.find(params[:id])
    @post = like.post
    like.destroy
  end
Puisque nous envoyons une requête au format js par remote: true, nous chercherons enfin le fichier js avec le nom de l'action (créer ou détruire) à exécuter. Par conséquent, créez un dossier J'aime sous app / views / et créez create.js.erb et destory.js.erb dans ce dossier.
js:create.js.erb
$("#like-<%= @post.id %>").html("<%= j(render 'posts/like', post: @post) %>");
js:destory.js.erb
$("#like-<%= @post.id %>").html("<%= j(render 'posts/like', post: @post) %>");
Identifie par identifiant et réécrit partiellement le code HTML. C'est tout ce qu'on peut en dire.
Recommended Posts