returnえんじにゃー

学び直し中元エンジニアのアウトプットブログ。技術やものづくり。たまに猫。

Rail7のstatus: :see_other、status: :unprocessable_entityについてメモ

はじめに

Rails7でscaffoldした時にdeleteやupdateのredirect_toについてくるstatus: :see_otherstatus: :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_entityHTTPステータスコード422に対応している。

サーバーにリクエストが到達はできているけど、送られてきたデータが原因でリクエストを処理ができなかった時などに返ってくる(バリデーションエラーなど)。

このステータスを明示的に返してあげないとエラーメッセージが表示されない。

そもそもなんでついているのか(これから追記予定)

Rails7から標準になったgem 'turbo-rails'に対応させるために上記のようなステータスをちゃんと返す必要があるらしい。

参考

ActionController::Redirecting

Getting Started with Rails — Ruby on Rails Guides

422 Unprocessable Entity - HTTP | MDN

レイアウトとレンダリング - Railsガイド

Turbo Handbook