フォロー・フォロワー機能

Rails5使用の、フォロー・フォロワー機能についてのまとめです。

UserとBookを作成しており、
１対多　となっています。

<h2>modelとcontrollerの作成</h2>

rails g controller Relationships
rails g model relationchip follower_id:integer foolowed_id:integert
カラム確認後
rails db:migrate

※　follower　する
　　followed  される

<h2>モデルのアソシエーション</h2>


```model:relationship.rb
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name:  "User"
```

class_name:　関連先のモデル参照する際の名前の変更



```ruby:user.rb
has_many :relationships,class_name: "Relationship",  foreign_key: "follower_id",dependent: :destroy
has_many :passive_relationships,class_name: "Relationship", foreign_key: "followed_id",dependent: :destroy
has_many :followings, through: :relationships,source: :followed
has_many :followers, through: :passive_relationships,source: :follower

def follow(user_id)
    unless self == user_id
     self.relationships.find_or_create_by(followed_id: user_id.to_i, follower_id: self.id)
    end
end

def unfollow(user_id)
    relationships.find_by(followed_id: user_id).destroy
end

def following?(user)
    followings.include?(user)
end

```

has_manyで条件を記載
has_many :relationships,  class_name:"Relationship"
↑relationshipsをRelationship名に変更

foreign_key(入口):"follower_id"
user.idがfollowerなのかfollowedなのか指定

has_many~~~~~~~~~through(経由)~~~~~~~source(出口)
userがfollower_idからrelationshipsを経由してfollowerに出る

簡潔にすると、フォローしている人の一覧

<h2>コントローラーとルーティング</h2>

[controller]


```ruby:relationships_controller.rb
def create
    current_user.follow(params[:user_id])
    redirect_to request.referer
end

def destroy
    current_user.unfollow(params[:user_id])
    redirect_to request.referer
end

def followings
    user = User.find(params[:user_id])
    @users = user.followings
end

def followers
    user = User.find(params[:id])
    @users = user.followers
end
 
```

[routes]


```ruby:routes.rb
resources :users do
   resouce :relationships, only: [:create, :destroy]
   get 'relationships/followers' => 'relationships#followers', as: 'followers'
   get 'relationships/followings' => 'relationships#followings', as: 'followings'
end

```

userとネストします。
get で　followers,followingsのuser一覧表示をさせる

<h2>viewの作成</h2>


```ruby:
<td>フォロー数: <%= user.followings.count %></td>
<td>フォロワー数: <%= user.followers.count %></td>
<td>
  <% unless current_user == user %>
   <% if current_user.following?(user) %>
     <%= link_to "フォロー外す", user_relationships_path(user.id), method: :delete %>
   <% else %>
     <%= link_to "フォロー", user_relationships_path(user.id), method: :POST %>
   <% end %>
  <% end %>
</td>

```

user.rbでfollowの表示は自分には不要（フォローするボタン）
unless self == user_id と記載済み

viewに <% unless current_user == user %>　と記載することで
自分のプロフィールにはフォローリンクがなくなります。


フォロー数、誰がフォローしているのか


```ruby:
<tr> 
 <th>follows</th>
 <th><%= link_to user.followings.count, user_followings_path(user.id) %></th>
</tr>
<tr>
 <th>followers</th>
 <th><%= link_to user.followers.count, user_followers_path(user.id) %></th>
</tr>

```

link_toでcount数にリンクがつき、
数字を押すと誰がフォローしているのかのviewページに飛ぶ

user_followings_pathは rails/info で root　の確認
user.idは　"誰が" userのidを拾う


[count数のリンク先のview]


```ruby:
<tr>
 <% if @user.exists? %>
  <th>name</th>
  <th></th>
</tr>
<tbody>
 <% @users.each do |user| %>
 <tr>
  <td><%= user.name %></td>
  <td>フォロー数: <%= user.followings.count %></td>
  <td>フォロワー数: <%= user.followers.count %></td>
  <td><%= link_to "Show", user %></td>
 <tr>
 <% end %>
</tbody>
 <% else %>
  <th>ユーザーはいません</th>
<% end %>
```


exists?メソッド => 指定した条件のレコードがデータベースに存在するかどうかを
真偽値で返すメソッド。
存在すれば、trueを、しなければfalseを返す。

each文で繰り返し処理をし、
user.nameで誰がフォローしているのか
user.nameさんは何人フォローしていて、何人フォロワーがいるのか
link_to "Show"でuser.nameさんのプロフィール画面へ遷移させる。


以上でフォロー・フォロワー機能の実装が終わりました。
足りない部分や、違うところがありましたら教えてください。