【rails】アンフォローを実装する(フォローを外す)

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

アンフォローを実装する

アンフォローのパスを設定する

routes.rbに以下を追記する

  resources :accounts, only: [:show] do
    resources :follows, only: [:create]
    resources :unfollows, only: [:create]
  end
[:destroy]ではなく、[:create]にして、新たにControllerを作る

今回は、「followをdestroyする」のではなく、「unfollowをcreateする」もの
(Relationshipをdestroyする、ならまだ分かる)


RESTfulの考え方

RESTfulとは、railsの基本的な概念のこと

※DHHさんはrailsを作った人

コントローラはデフォルトのCRUDアクション index 、 show 、 new 、 edit 、 create 、 update 、 destroy のみを使うべきだということ

自分の作ったコントローラの状態を悔やむのは決まって、作ったコントローラの数が少なすぎた時です。多くの処理を任せようとしすぎてしまうんです。

わかりやすくシンプルにすること!


新たにControllerを作る

unfollows_controller.rbを作り、以下を書く(Followsとほぼ同じ)

class UnfollowsController < ApplicationController
  before_action :authenticate_user!

  def create
    current_user.unfollow!(params[:account_id])
    redirect_to account_path(params[:account_id])
  end
end


unfollowのメソッドを定義する

user.rbを開く

  def follow!(user)
    user_id = get_user_id(user)
    following_relationships.create!(following_id: user_id)
  end

  def unfollow!(user)
    user_id = get_user_id(user)
    relation = following_relationships.find_by!(following_id: user_id)
    relation.destroy!
  end

  private
  def get_user_id(user)
    if user.is_a?(User)
      user.id
    else
      user
    end
  end

共通して使うメソッドget_user_id(user)は、private内で定義する

同じコードをあちこちで使うと保守性が悪くなるうえに、バグの原因にもなる


Unfollowのボタンを作る

_profile.html.hamlで以下に書き換える

= link_to 'Unfollow', account_unfollows_path(user), data: { method: 'post'}

#DAY3