0
0

More than 1 year has passed since last update.

[Rails]before_actionで先にincludesした時の罠

Last updated at Posted at 2022-05-09

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達)を先読みしているため、フォローを解除する前のデータを先読みしてしまっていたのです。
よくよく考えてみれば当たり前ですよね笑

リファクタリングをした時に起きた問題だったので、リファクタリングをするためには機能実装以上に知識が求められるなと感じました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0