LoginSignup
1
0

フォロー機能

Last updated at Posted at 2023-07-08

:shamrock: 前提条件 

・バージョン rails 6.1.7
・device導入 ・Bootstrap導入
・ユーザー機能実装済(Userモデル)
・投稿機能実装済(Bookモデル)


:shamrock: モデル作成

:star: Relationshipsモデルを作成

rails g model Relationship follower_id:integer followed_id:integer
rails db:migrate

追加カラムは以下のとおりです。

 create_table "relationships", force: :cascade do |t|
    t.integer "follower_id"
    t.integer "followed_id"
    t.datetime "created_at", precision: 6, null: false
    t.datetime "updated_at", precision: 6, null: false

:shamrock: アソシエーション

user.rb
 #フォローしている
  has_many :follower, class_name: "Relationship", foreign_key: "follower_id", dependent: :destroy
  #フォローされてる
  has_many :followed, class_name: "Relationship", foreign_key: "followed_id", dependent: :destroy
  #フォローしている人(全体)
  has_many :follower_users, through: :followed, source: :follower
  #フォローされている人(全体)
  has_many :following_users, through: :follower, source: :followed

フォローしている」: 自分が追いかけている友達(自分がフォローしている)を表すリストです。
フォローされている」: 自分を追いかけている友達(フォロワー1人)を表すリストです。
フォローしている人(全体)」: 自分が追いかけているすべての友達を見つけるためのリストです。
フォローされている人(全体)」: 自分を追いかけているすべての友達(フォロワー)を見つけるためのリストです。

relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end

フォローするユーザーとフォローされるユーザーの関係を表しています。


:shamrock: ルーティング

 resources :users, only: [:index,:show,:edit,:update] do
   resource :relationships, only:[:create, :destroy]
   get 'follows' => 'relationships#follower'
   get 'followers' => 'relationships#followed'
  end

:snowflake:resource :relationships, only:[:create, :destroy]
各ユーザーは友達関係を作ったり消したりできます。これは/users/:id/relationshipsというパスで行えます。

一覧ページ用
:snowflake:get 'follows' => 'relationships#follower':ユーザーがフォローしている人の一覧を表示します。 (パス:/users/4/follows)
:snowflake: get 'followers' => 'relationships#followed':フォロワーの一覧を表示します。(パス: /users/:id/followers)

以下のように追加しても一覧ページ用のパスが作成できる。

 member do
   get :followed, :follower
   end

:shamrock: コントローラー

relationships_contoroller.rb
class RelationshipsController < ApplicationController
  def create
    current_user.follow(params[:user_id])
    redirect_to request.referer
  end
  
  def destroy
     current_user.unfollow(params[:user_id])
    redirect_back(fallback_location: root_path)
  end
  #フォローされている
  def follower
   user = User.find(params[:user_id])
    @users = user.following_users
  end
  #フォローしている
  def followed
    user = User.find(params[:user_id])
    @users = user.follower_users
  end
end

:snowflake:create: ユーザーが他のユーザーをフォローする操作をします。操作後、元のページに戻ります。
:snowflake:destroy: ユーザーが他のユーザーのフォローを解除する操作をします。操作後、元のページまたはホームページに戻ります。

:snowflake:follower: ユーザーがフォローしている人々のリストを取得します。

:snowflake:followed: ユーザーをフォローしている人々のリストを取得します。


:shamrock: views

:star:フォローボタンを表示したいとことに以下を追加

 <% if current_user != user %>
          <% if current_user.following?(user) %>
            <%= link_to 'フォロー外す', user_relationships_path(user.id), method: :delete, class: "btn btn-default" %>
          <% else %>
            <%= link_to 'フォローする', user_relationships_path(user.id), method: :POST , class: "btn btn-primary"%>
           <% end %>
        <% end %>

:star: フォロー、フォロワー数を表示する場合

 <td>フォロー数:<%= user.follower.count %></td>
 <td>フォロワー数:<%= user.followed.count %></td>

:apple:
完成イメージ

スクリーンショット 2023-07-08 22.14.51.png

スクリーンショット 2023-07-08 22.18.33.png

:hatching_chick: ひとこと

ご覧いただきありがとうございました!
今回は、フォローするボタンを作成するところまでです。
フォロー、フォロワーの一覧ページは別に投稿してあります。
まだまだ、初心者なので、間違っている部分があれば教えていただけた助かります。

:cherry_blossom: 参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0