Rails入門9 フォロー機能 ~Twitterもどきが出来るまで~

前回まで

今回やりたいこと

フォロー/アンフォロー機能

↓未フォロー時

スクリーンショット 2020-03-04 4.17.56

↓フォロー済時

スクリーンショット 2020-03-04 4.18.08

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

淡々とやってて無駄話ができなくなってる。。。