前提条件
・バージョン rails 6.1.7
・device導入 ・Bootstrap導入
・ユーザー機能実装済(Userモデル)
・投稿機能実装済(Bookモデル)
モデル作成
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
アソシエーション
#フォローしている
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人)を表すリストです。
「フォローしている人(全体)」: 自分が追いかけているすべての友達を見つけるためのリストです。
「フォローされている人(全体)」: 自分を追いかけているすべての友達(フォロワー)を見つけるためのリストです。
class Relationship < ApplicationRecord
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
end
フォローするユーザーとフォローされるユーザーの関係を表しています。
ルーティング
resources :users, only: [:index,:show,:edit,:update] do
resource :relationships, only:[:create, :destroy]
get 'follows' => 'relationships#follower'
get 'followers' => 'relationships#followed'
end
resource :relationships, only:[:create, :destroy]
各ユーザーは友達関係を作ったり消したりできます。これは/users/:id/relationshipsというパスで行えます。
一覧ページ用
get 'follows' => 'relationships#follower':ユーザーがフォローしている人の一覧を表示します。 (パス:/users/4/follows)
get 'followers' => 'relationships#followed':フォロワーの一覧を表示します。(パス: /users/:id/followers)
以下のように追加しても一覧ページ用のパスが作成できる。
member do
get :followed, :follower
end
コントローラー
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
create: ユーザーが他のユーザーをフォローする操作をします。操作後、元のページに戻ります。
destroy: ユーザーが他のユーザーのフォローを解除する操作をします。操作後、元のページまたはホームページに戻ります。
follower: ユーザーがフォローしている人々のリストを取得します。
followed: ユーザーをフォローしている人々のリストを取得します。
views
フォローボタンを表示したいとことに以下を追加
<% 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 %>
フォロー、フォロワー数を表示する場合
<td>フォロー数:<%= user.follower.count %></td>
<td>フォロワー数:<%= user.followed.count %></td>
ひとこと
ご覧いただきありがとうございました!
今回は、フォローするボタンを作成するところまでです。
フォロー、フォロワーの一覧ページは別に投稿してあります。
まだまだ、初心者なので、間違っている部分があれば教えていただけた助かります。
参考