#概要
Qiita:フォロー機能の実装方法
フォロー機能を非同期化する
上の2つの記事を参考にして、フォロー機能を実装しました。しかし記事通りにform_forにremote: trueを記述し、jsファイルを作りましたが、非同期化されませんでした。同期通信ではフォロー機能はしっかり動くので、恐らく部分テンプレートかjsファイルに記述ミスがあるのだと思いますが、自分的には間違っているところを見つけることができませんでした。以下にアプリケーションのgifのurlを貼っておきます。
フォロー機能のGif
該当のソースコード
こちらはコントローラーの記述です。
Ruby
1class RelationshipsController < ApplicationController 2 before_action :set_user 3 4 def create 5 following = current_user.follow(@user) 6 if following.save 7 flash[:success] = 'ユーザーをフォローしました' 8 else 9 flash.now[:alert] = 'ユーザーのフォローに失敗しました' 10 end 11 end 12 13 def destroy 14 following = current_user.unfollow(@user) 15 if following.destroy 16 flash[:success] = 'ユーザーのフォローを解除しました' 17 else 18 flash.now[:alert] = 'ユーザーのフォロー解除に失敗しました' 19 end 20 end 21 22 private 23 def set_user 24 @user = User.find(params[:follow_id]) 25 end 26end 27
こちらはユーザーマイページのビューファイル です。(views/users/show.html.erb)
一番下にあるrenderでフォーム機能の部分テンプレートを呼び出しています。divについているidはAjax化する際の指標のidです。
Ruby
1<%= render "shared/header" %> 2<%= @user.nickname %> 3 4<h2>プロフィール画像</h2> 5<% if @user.image.attached? %> 6 <p><%= image_tag(rails_blob_path(@user.image),:size => "50x50") %></p> 7<% else %> 8 <p><%= image_tag("default_user.png", :size => "50x50") %></p> 9<% end %> 10 11<%= link_to "ユーザー情報編集", edit_user_path(current_user.id) %> 12 13<div id="follow-ajax"> 14 <%= render 'shared/follow',user: @user %> 15</div>
フォロー機能の部分テンプレート(views/shared/_follow.html.erb)です。
こちらで remote: trueに設定しています。
Ruby
1<% unless current_user == user %> 2 <% if current_user.following?(user) %> 3 <%= form_for(current_user.relationships.find_by(follow_id: user.id), html: { method: :delete }, remote: true) do |f| %> 4 <%= hidden_field_tag :follow_id, user.id %> 5 <%= f.submit 'Unfollow', class: 'btn btn-danger btn-block' %> 6 <% end %> 7 <% else %> 8 <%= form_for(current_user.relationships.build, remote: true) do |f| %> 9 <%= hidden_field_tag :follow_id, user.id %> 10 <%= f.submit 'Follow', class: 'btn btn-primary btn-block' %> 11 <% end %> 12 <% end %> 13<% end %>
こちらコントローラーのcreateアクションのビューです。(views/relationships/create.js.erb)
Ruby
1document.getElementById('follow-ajax').innerHTML = '<%= j(render partial: 'shared/follow', user: @user ) %>'
こちらはコントローラーのdestroyアクションのビューです。
(views/relationships/destroy.js.erb)
Ruby
1document.getElementById('follow-ajax').innerHTML = '<%= j(render partial: 'shared/follow', user: @user ) %>'
自分で試したこと
一度、コードをしっかり確認しましたが、間違いは発見できませんでした。
様々な他の人の情報でも試しましたが、ダメでした。
回答お待ちしています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/02 05:03