【Rails】ユーザ情報更新時に気をつけること

ビューのヘッダーなどにcurrent_userを使ってユーザ名などを表示する場合、validateionに引っかかると意図しない表示になるので注意が必要。

前提

  • ログイン中ユーザー名を表示するためにビューにのヘッダー部分に<%= current_user.name if current_user %>を記述
  • モデルにユーザ名のvalidationとしてlength: { maximum: 10 }を記述

良い記述

class UsersController < BaseController

  def update
    @user = User.find(current_user.id)
    if @user.update(user_params)
      redirect_to user_url
    else
      render :edit
    end
  end

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end

end

良くない記述

class UsersController < BaseController

  def update
    if current_user.update(user_params)
      redirect_to user_url
    else
      render :edit
    end
  end

  def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end

end

それぞれの記述の違い

  • @user = current_userの場合
    • ユーザ名の更新に失敗しているにも関わらず、ヘッダー部分に11文字以上のユーザ名(あえて失敗するために入力したユーザ名)が表示される
    • 画面をリロードするとヘッダー部分は以前のユーザ名に戻る
  • @user = User.find(current_user.id)の場合
    • ユーザ名の更新に失敗し、なおかつ以前のユーザ名がヘッダー部分に表示されている

結論

  • validationにひっかかったとしても、DBが更新されないだけでオブジェクト(current_user)の中身は変わってしまっている
  • 今回の場合は、都度User.findで都度DBからデータを引っ張ってこないとビューの値と異なってしまうので注意が必要

参考

diary.shu-cream.net