Rails入門9 フォロー機能 ~Twitterもどきが出来るまで~
前回まで
今回やりたいこと
フォロー/アンフォロー機能
↓未フォロー時
↓フォロー済時
model, controllerの作成
$ rails g model Follow user_id:integer follow_user_id:integer
$ app/controllers/follows_controller.rb
app/models/follow.rb
class Follow < ApplicationRecord
belongs_to :user
validates :follow_user_id, uniqueness: { scope: :user_id }
end
app/models/user.rb
has_many :follows , class_name: "Follow", foreign_key: "user_id"
has_many :followers, class_name: "Follow", foreign_key: "follow_user_id"
def already_followed?(user)
Follow.find_by(follow_user_id: user.id, user_id: self.id)
end
いつもmodelの修正後にdb:migrateやってるけど、いつやるのが正解なんだろう。。。
$ rails db:migrate
app/controllers/follows_controller.rb
class FollowsController < ApplicationController
def create
follow_user_id = params[:follow_user_id].to_i
if current_user.id == follow_user_id
flash[:notice] = '自身をフォローすることはできません'
else
@user = current_user
follow = current_user.follows.new(follow_params)
follow.save
end
redirect_to user_path(User.find(follow_user_id))
end
def destroy
Follow.where(user_id: current_user.id, follow_user_id: params[:follow_user_id]).destroy_all
redirect_to user_path(User.find(params[:follow_user_id]))
end
private
def follow_params
params.permit(:user_id, :follow_user_id)
end
end
config/routes.rb
resources :follows, only: [:create, :destroy] # 追記
app/views/users/show.html.erb
追記分のみ記載。未フォローとフォロー済の分岐
<% unless @user.id == current_user.id %>
<div class="field">
<div class="control">
<% if current_user.already_followed?(user) %>
<%= button_to "Unfollow", follow_path(user.id), method: :delete, class: "button", remote: true %>
<% else %>
<%= button_to "Follow", follows_path({follow_user_id: user.id}), method: :post, class: "button is-info", remote: true %>
<% end %>
</div>
</div>
<% end %>
淡々とやってて無駄話ができなくなってる。。。