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 される
モデルのアソシエーション
belongs_to :follower, class_name: "User"
belongs_to :followed, class_name: "User"
class_name: 関連先のモデル参照する際の名前の変更
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]
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]
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さんのプロフィール画面へ遷移させる。
以上でフォロー・フォロワー機能の実装が終わりました。
足りない部分や、違うところがありましたら教えてください。