質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

0回答

617閲覧

Rails : 非同期でフォローボタンを実装したい

rikuou

総合スコア25

Ruby on Rails 5

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2020/11/14 01:46

ruby ons railsでwebアプリを作成しています
フォローボタンをajaxを用いて、非同期に処理をしたいのですがうまくいきません
自分で必死に考えて、調べてみたのですが、どこが間違っているかがわかりませんでした。
どなたかコード上で間違っている点がありましたら、ご教授お願いいたします

gemでjquery-rails はインストール済みです
devise導入済み

困っていること

フォロー済みボタンを押しても、フォローするといったボタンに非同期で変化しません
ブラウザを再読み込みすると反映されます

###試したこと
下記サイトを参考にして, リンクのデータ属性のturbolinkをオフにしました
https://qiita.com/avicii2314/items/df6d2a90aeff127d4fc0

コード

javascripts/application.js //= require rails-ujs //= require activestorage //= require turbolinks //= require jquery3 //= require popper //= require bootstrap-sprockets //= require_tree .
routes.rb Rails.application.routes.draw do devise_for :admin_users, ActiveAdmin::Devise.config ActiveAdmin.routes(self) devise_for :users get 'home/index' get 'home/myself' root to: "home#index" get 'search', to: 'classrooms#search' resources :classrooms, only: [:index, :show, :create] do resource :reviews, only: [:create] get :rate, on: :member end resources :users, only: [:index, :show] do resource :relationships, only: [:create, :destroy] get :follows, on: :member get :followers, on: :member end resources :clubs # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html end
relationship.rb class Relationship < ApplicationRecord belongs_to :following, class_name: 'User' belongs_to :follower, class_name: 'User' validates :following_id, presence: true validates :follower_id, presence: true end
user.rb class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable mount_uploader :image, ImageUploader devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable #自分がフォローしているユーザとの関連 has_many :active_relationships, class_name: 'Relationship', foreign_key: :following_id, dependent: :destroy has_many :followings, through: :active_relationships, source: :follower #自分がフォローされているユーザとの関連 has_many :passive_relationships, class_name: 'Relationship', foreign_key: :follower_id, dependent: :destroy has_many :followers, through: :passive_relationships, source: :following def followed_by?(user) passive_relationships.find_by(following_id: user.id).present? end end
relationships_controller.rb class RelationshipsController < ApplicationController #フォローする def create follow = current_user.active_relationships.new(follower_id: params[:user_id]) follow.save @user = User.find(params[:user_id]) respond_to do |format| format.html { redirect_to @user } format.js end end #アンフォローする def destroy follower = current_user.active_relationships.find_by(follower_id: params[:user_id]) follower.destroy @user = User.find(params[:user_id]) respond_to do |format| format.html { redirect_to @user } format.js end end end
views/users/show.html.erb <div class="container-fluid"> <div class="row my-5"> <div class="col-1 offset-2"> <!-- ユーザ画像 --> <% if @user.image.blank? %> <%= image_tag 'default.jpg', class: "icon-image" %> <% else %> <img src=<%= @user.image %> class="icon_image" > <% end %> </div> <!-- ユーザ詳細 --> <div class="col-7 mt-1 pl-5"> <span class="user-name"><%= @user.username %></span> <!-- フォローボタン --> <% if @user.id != current_user.id %> <span id="follow-button_#{ @user.id }"> <%= render 'users/follow_button', user: @user %> </span> <% end %> <p class="user-profile mt-2"><%= @user.profile %></p> <td id ="following-count_#{ @user.id }"> <%= link_to "#{@user.active_relationships.count}フォロー", follows_user_path(@user.id), data: {"turbolinks" => false} %> </td> <td id="follower-count_#{ @user.id }"> <%= link_to "#{@user.passive_relationships.count}フォロワー", followers_user_path(@user.id), data: {"turbolinks" => false} %> </td> </div> </div> </div>
_follow_button.html.erb <% if user.followed_by?(current_user) %> <%= link_to 'フォロー済み', user_relationships_path(user.id), method: :delete, data: {"turbolinks" => false}, class: "unfollow-link d-block px-3 py-1 float-right", remote: true %> <% else %> <%= link_to 'フォロー', user_relationships_path(user.id), method: :post, data: {"turbolinks" => false}, class: "follow-link d-block px-3 py-1 float-right", remote: true %> <% end %>
views/relationships/create.js.erb $("#follow-button_<%= @user.id %>").html("<%= escape_javascript(render 'users/follow-button', user: @user) %>"); $("#follower-count_<%= @user.id %>").html(' <%= link_to "#{@user.passive_relationships.count}フォロワー", followers_user_path(@user.id) %>'); $("#following-count_<%= current_user.id %>").html('<%= link_to "#{@user.active_relationships.count}フォロー", follows_user_path(@user.id) %>');
views/relationships/destroy.js.erb $("#follow-button_<%= @user.id %>").html("<%= escape_javascript(render 'users/follow-button', user: @user) %>"); $("#follower-count_<%= @user.id %>").html(' <%= link_to "#{@user.passive_relationships.count}フォロワー", followers_user_path(@user.id) %>'); $("#following-count_<%= current_user.id %>").html('<%= link_to "#{@user.active_relationships.count}フォロー", follows_user_path(@user.id) %>');

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

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

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

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

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

hatsu

2020/11/14 05:04

ブラウザのConsoleにエラーが出ていたりしますでしょうか?またフォローするボタンを押したときのRailsのログもあると、解決のヒントになりそうです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問