フォロー機能

### :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
```
追加カラムは以下のとおりです。
```diff_ruby
 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
```
「**フォローしている**」: 自分が追いかけている友達（自分がフォローしている）を表すリストです。
「**フォローされている**」: 自分を追いかけている友達（フォロワー１人）を表すリストです。
「**フォローしている人（全体）**」: 自分が追いかけているすべての友達を見つけるためのリストです。
「**フォローされている人（全体）**」: 自分を追いかけているすべての友達(フォロワー）を見つけるためのリストです。
```relationship.rb
class Relationship < ApplicationRecord
  belongs_to :follower, class_name: "User"
  belongs_to :followed, class_name: "User"
end
```
フォローするユーザーとフォローされるユーザーの関係を表しています。
____
### :shamrock: ルーティング
```diff_ruby
 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)

:::note info
以下のように追加しても一覧ページ用のパスが作成できる。
```diff_ruby
 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:フォローボタンを表示したいとことに以下を追加
```diff_ruby
 <% 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: フォロー、フォロワー数を表示する場合
```diff_html
 <td>フォロー数:<%= user.follower.count %></td>
 <td>フォロワー数:<%= user.followed.count %></td>
```
___
**:apple: 
完成イメージ**
![スクリーンショット 2023-07-08 22.14.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/7ee14fae-71f8-c794-8a5d-28151204b720.png)

![スクリーンショット 2023-07-08 22.18.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/6d398cc4-02e5-20f9-ad68-ab1b95abb809.png)

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

### :cherry_blossom: 参考

https://qiita.com/mikan-orange/items/9711390f559c2e8d59ab

https://qiita.com/hapiblog2020/items/ec52126e107727c20802