💭

Rails update vs update!

2022/02/01に公開

NG

# NG:  
if @article.update!(article_params)
   redirect_to medium_article_path(@current_medium, @article), success: '記事を更新しました'
else
   redirect_to medium_article_path(@current_medium, @article), danger: '記事更新に失敗しました'
end

WHY


https://railsdoc.com/page/model_update

  • update, update!ともにvalidationを行う
  • updateはバリデーション失敗時、falseを返す
  • update!はバリデーション失敗時、例外を発生させる
  • そのためelseへ移動しない
# https://railsdoc.com/page/model_update より参照
# 失敗したら例外発生
モデル.update!(ID=:all, 属性)

GOOD

  • update!ではなくupdateで実装する
  • update!を使う場合はrescueで実装する
  • でも本当はrescueではなくif elseで解決したほうがよい
# GOOD 
@article.update!(article_params)
   redirect_to medium_article_path(@current_medium, @article), success: '記事を更新しました'
rescue StandardError => e
   redirect_to medium_article_path(@current_medium, @article), danger: e
end

参考

https://koheinishino.com/summary-of-the-rails-update-method

https://railsdoc.com/page/model_update

Discussion