0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

modelとcontrollerの作成

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

※ follower する
  followed される

モデルのアソシエーション

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

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

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に出る

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

コントローラーとルーティング

[controller]

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]

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一覧表示をさせる

viewの作成

<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 %> と記載することで
自分のプロフィールにはフォローリンクがなくなります。

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

<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]

<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さんのプロフィール画面へ遷移させる。

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

0
1
1

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?