はじめに
Rails7でscaffoldした時にdeleteやupdateのredirect_toについてくるstatus: :see_other
、status: :unprocessable_entity
。
前職で携わっていたRails5やRails6のプロジェクトでは見たことがなかったので調べてみた。
deleteにデフォルトでついている
# DELETE /users/1 def destroy @user.destroy! redirect_to users_url, notice: 'User was successfully destroyed.', status: :see_other end
なんなのか
status: :see_otherはHTTPステータスコード303に対応している。
新しくアップロードされたリソースではなく別ページにリンクする時にこのステータスを指定しないと、 一部のブラウザなどでは元のリクエストメソッドを使用してリダイレクトしようとするため、 二重 DELETE などの望ましくない動作が発生する可能性があるらしい。
Rails 7でデフォルトになったturbo-railsに対応するために必要らしく、 railsガイドでもこのステータスを指定することを推奨している。
※ button_to の場合は status: :see_other を付けなくても正常に動作する。
updateの方は?
# PATCH/PUT /users/1 def update if @user.update(user_params) redirect_to @user, notice: 'User was successfully updated.', status: :see_other else render :edit, status: :unprocessable_entity end end
なんなのか
status: :unprocessable_entity
はHTTPステータスコード422に対応している。
サーバーにリクエストが到達はできているけど、送られてきたデータが原因でリクエストを処理ができなかった時などに返ってくる(バリデーションエラーなど)。
このステータスを明示的に返してあげないとエラーメッセージが表示されない。
そもそもなんでついているのか(これから追記予定)
Rails7から標準になったgem 'turbo-rails'
に対応させるために上記のようなステータスをちゃんと返す必要があるらしい。
参考
Getting Started with Rails — Ruby on Rails Guides