search
LoginSignup
0
Help us understand the problem. What are the problem?

posted at

updated at

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

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

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

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?