フォロー機能を作ってみた！

今回はフォロー機能を実装していきたいと思います！:girl:

必要なテーブルは２つ
・Usesテーブル
・Relationshipsテーブル（usersテーブルとusersテーブルを繋ぐ中間テーブル）

##それでは実装していきます
①Relationshipsモデルを作る

```rudy:terminal
$ rails g model Relationship
```

②マイグレーションファイルを以下のように編集

```rudy:db/migrate/__create.relationship.rb
class CreateRelationships < ActiveRecord::Migration[5.2]
  def change
    create_table :relationships do |t|
      t.references :user, foreign_key: true
      t.references :follow, foreign_key: { to_table: :users }

      t.timestamps

      t.index [:user_id, :follow_id], unique: true

    end
  end
end
```

終わったら忘れずに

```rudy:terminal
$ rails db:migrate
```
③リレーションを組む

```rudy:models/relationship.rb
class Relationship < ApplicationRecord
  belongs_to :user
  belongs_to :follow, class_name: 'User'

  validates :user_id, presence: true
  validates :follow_id, presence: true
end
```

```rudy:models/user.rb
class User < ApplicationRecord
  has_many :relationships
  has_many :followings, through: :relationships, source: :follow
  has_many :reverse_of_relationships, class_name: 'Relationship', foreign_key: 'follow_id'
  has_many :followers, through: :reverse_of_relationships, source: :user
end

def follow(other_user)
    unless self == other_user
      self.relationships.find_or_create_by(follow_id: other_user.id)
    end
  end

  def unfollow(other_user)
    relationship = self.relationships.find_by(follow_id: other_user.id)
    relationship.destroy if relationship
  end

  def following?(other_user)
    self.followings.include?(other_user)
  end
```
④コントローラー作成

```rudy:terminal
$ rails g controller relationships
```
```rudy:relationships.controller.rb
 before_action :set_user

  def create
    following = current_user.follow(@user)
    if following.save
      flash[:success] = 'ユーザーをフォローしました'
      redirect_to @user
    else
      flash.now[:alert] = 'ユーザーのフォローに失敗しました'
      redirect_to @user
    end
  end

  def destroy
    following = current_user.unfollow(@user)
    if following.destroy
      flash[:success] = 'ユーザーのフォローを解除しました'
      redirect_to @user
    else
      flash.now[:alert] = 'ユーザーのフォロー解除に失敗しました'
      redirect_to @user
    end
  end

  private
  def set_user
    @user = User.find(params[:relationship][:follow_id])
  end
```
⑤フォローボタンをviewに記述

```rudy:view/relationships/_follow_button.html.erb
<% unless current_user == user %>
  <% if current_user.following?(user) %>
    <%= form_for(current_user.relationships.find_by(follow_id: user.id), html: { method: :delete }) do |f| %>
      <%= hidden_field_tag :follow_id, user.id %>
      <%= f.submit 'Unfollow', class: 'btn btn-danger btn-block' %>
    <% end %>
  <% else %>
    <%= form_for(current_user.relationships.build) do |f| %>
      <%= hidden_field_tag :follow_id, user.id %>
      <%= f.submit 'Follow', class: 'btn btn-primary btn-block' %>
    <% end %>
  <% end %>
<% end %>
```

⑥呼び出したいところに呼び出す

```
<%= render 'relationships/follow_button', user: @user %>
```

⑦　ルーティング設定

```rudy:routes.rb
resources :relationships, only: [:create, :destroy]
```
完成！！！

ちなみに、、、
あれ、レンダーで呼び出したのにフォローボタンが出ないよーー:cry:
って思っている方おりません？？

みなさんはお気づきですよね？
今ログインしているユーザーにはフォローボタンは出ません:no_mouth:

新しいユーザーでログインしてみてください。大丈夫。ちゃんとボタン出てますから〜

私はこれに気づかず何度もやり直ししました。。。。:sob:
30分で出来てたのに結果３時間もかかってしまいました
へたこいたー