【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からデータを引っ張ってこないとビューの値と異なってしまうので注意が必要