Railsでincludesメソッドを使用してデータの読み込み速度をあげようとした時にタイトルにある通り、罠に引っ掛かりました。
※コードは一部抜粋して内容も変更しています。
before_action :set_user
def destroy
return head :unprocessable_entity unless @user.unfollow(@follow)
render json: @user
end
private
def set_user
@user = User.includes(:following).find(params[:user_id])
@follow = User.find(params[:follow_id])
end
このコードはフォロー機能を実装しているコードの一部で、destroyアクション内ではフォローを解除出来た場合はuserのデータを返しています。
開発環境で実際にフォローのボタンを押してみると200レスポンスが返り、データも返ってきています。
しかし、フォローボタンがリアクティブに反応しません。
原因は、フォロー解除後のデータではなくフォロー解除前のデータが返っていました。
unfollowメソッドを実行する前にincludesメソッドでfollowing(userがフォローしている他のuser達)を先読みしているため、フォローを解除する前のデータを先読みしてしまっていたのです。
よくよく考えてみれば当たり前ですよね笑
リファクタリングをした時に起きた問題だったので、リファクタリングをするためには機能実装以上に知識が求められるなと感じました。