1.非同期機能とは
- 画面全体を更新せずに、一部だけ更新すること
- Ajaxという手法が使用されます。
2.実装
2−1.リンクにremote: true
を追記する
- これにより、リクエストがhtml形式からjs形式になる
app/views/posts/show.html.erb
<% if current_user && @post.favorited_by?(current_user) %>
<%= link_to post_favorites_path(@post), method: :delete, remote: true, class: "favorite_btn" do %>
♥<%= @post.favorites.count %> いいね
<% end %>
<% else %>
<%= link_to post_favorites_path(@post), method: :post, remote: true, class: "favorite_btn" do %> #ここ
♡<%= @post.favorites.count %> いいね
<% end %>
<% end %>
2−2.ボタンを部分をテンプレート化する
- 2−1の部分を切り取り
views/favorites/_favorite.html.erb
というファイルを作成 - 部分テンプレートのファイルではインスタン変数を使用することは適切ではないのでローカル変数で記述する。
views/favorites/_favorite.html.erb
<% if current_user && @post.favorited_by?(current_user) %>
<%= link_to post_favorites_path(post), method: :delete, remote: true, class: "favorite_btn" do %>
♥<%= post.favorites.count %> いいね
<% end %>
<% else %>
<%= link_to post_favorites_path(post), method: :post, remote: true, class: "favorite_btn" do %>
♡<%= post.favorites.count %> いいね
<% end %>
<% end %>
2−3.先程の部分テンプレートを呼び出すための記述をする
- ここでは、部分テンプレート自体にidをつけ投稿ごとにいいねをできるようにしている。
- これがないと、すべての投稿に対していいねをおこなってしまう.
views/posts/show.html.erb
<div id="favorite_btn_<%= @post.id %>">
<%= render 'favorites/favorite', post: @post %>
</div>
2-4.JavaScriptファイルを作成
-
remote: true
の設定により、リクエストがhtml形式ではなくjs形式になっているので対応するファイルを作成する - 以下を新規で作成
views/favorites/create.js.erb
$('#favorite_btn_<%= @post.id %>').html("<%= j(render partial: 'favorites/favorite', locals: {post: @post}) %>");
views/favorites/destroy.js.erb
$('#favorite_btn_<%= @post.id %>').html("<%= j(render partial: 'favorites/favorite', locals: {post: @post}) %>");
以上で、非同期通信を実装できる
3.さいごに
- フォロー機能なども同様の手順で非同期化を実装できます。