🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Q&A

解決済

1回答

1736閲覧

Railsで実装したフォロー機能の非同期化がうまくいかない。

TTTTaison

総合スコア6

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

0グッド

0クリップ

投稿2021/02/27 07:50

編集2021/02/28 07:25

#概要
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 ) %>'

自分で試したこと

一度、コードをしっかり確認しましたが、間違いは発見できませんでした。
様々な他の人の情報でも試しましたが、ダメでした。

回答お待ちしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

jsからみはあまり得意ではないのですが、どなたも回答していないようなので、、、
気になるのは
'<%= j(render partial: 'shared/follow', user: @user ) %>'
シングルクオーテーションで式が途切れてます。
logになにか出ていませんか?
"<%= j(render partial: 'shared/follow', user: @user ) %>"
にしてみるとどうでしょう。

投稿2021/03/01 23:06

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TTTTaison

2021/03/02 05:03

今確認してみたら、create.js.erbとdestroy.js.erbにlocalsの記述がしていないのに気づきました。わざわざ回答をいただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問