LoginSignup
3
0

More than 1 year has passed since last update.

Rails Turboでvalidateが通らない無効なformの処理に書くunproccessable_entityについて

Last updated at Posted at 2022-12-20

概要

PFを個人開発しているrailsしか知らない素人です。なので記事の信憑性については甚だ疑問があります。

万物は流転するものであり、色々と変わっていくもの…
railsはrails7からhotwire(含むTurbo)がdefaultになりました。でかい変更ですよねこれ?
hotwireが何者なのかは色々な記事やサイトで説明されてますので割愛させていただきますが、簡単に言えばDHHの愛がこもったJSが書けない私へのギフトです。
アプリをフロントと分けてrailsはapiモードでjsonを出し入れするバックエンドのみに徹するみたいなことはきっと大変だと思うんですよ。(やったことないんで推測です)
railsのみでもモダンなアプリを作れるんだぞっていうやつです。

rails7に触ってまず何これ?となったのが、以下の様に無効なフォーム送信時のelse処理に書いてあるstatus: :unprocessable_entityってやつです。

  def create
    @quote = Quote.new(quote_params)

    if @quote.save
      redirect_to quotes_path, notice: "Quote was successfully created."
    else
      render :new, status: :unprocessable_entity
    end
  end

なんですかコレ…

ほんとなんなんですかコレ?

試しになしだとどうなるのか?
仕込んでいるerror messageが出ません。
(言い忘れてましたがformにerror_message出る様にしてることは前提としてます すいません)
開発者ツールのコンソール上に以下のエラーが出ることが確認できます。(@開発環境)
スクリーンショット 2022-12-20 14.48.06.JPG

まずはTurboくんが一体全体何をしてくれちゃってんのかを知らねばならない気がします。
Turboくんには4つ種類がある様です。
Turbo Drive: リンクとフォームの送信を高速化するぞ
Turbo Frame: ページを分解して個別に読み込みするぞ 遅延読み込みもできるぞ
Turbo Stream: WebSocket、SSEを介してページ変更したりCRUD likeなアクションでフォームに応答できるぞ
Turbo Native: iOSアダプタやAndroidアダプタを提供してrails appをそのままiOS、Androidのアプリにできるぞ
書いといて全然意味わかっていませんが、今回関係あるのは最初のTurbo Driveくんが該当するのかな

Turbo Driveくんが何をしているのか

Turbo DriveくんはTurbo四天王の中でも最弱(意味不明)
rails-turbo gemが入っていれば何もせずにデフォルトで適用され、すべてのリンクとフォーム送信をAJAXリクエストに変換することでアプリケーションを高速化してくれます。
リンクのクリックまたはフォームの送信をインターセプトして、AJAXリクエストへ変換しその応答は、htmlページの<body>を置き換えるためだけに機能するそうです。
つまり、rails7で作成したCRUDアプリケーションは何もせずにSPA(single page application)になっちゃうらしいです。
嘘でしょ?
Turbo Driveくんは何もわかってない僕の代わりに気づかないうちにアプリを高速にしてくれているんですね。有難いことこの上ないです。

本題に戻りますが、さすがの私もTurbo Driveくんが良かれと思ってフォーム送信処理をAJAXリクエスト化してくれていることが、error messageを表示することを阻害しているんだろうなと察しました。

では、error messageを表示するためにどうすればいいのか? 
 ➡️ html status code 422を返せばいいらしいです。
code 422についてのmdnの解説では「サーバーが要求本文のコンテンツ型を理解でき、要求本文の構文が正しいものの、中に含まれている指示が処理できなかったことを表します。」 ざっくりvalidationが通らなかったよということを示すstatusってことでしょう 多分…
そしてRailsではstatus code 422のエイリアスは:unprocessable_entityとなリます。
繋がりましたね… (得意気)
status: :unprocessable_entityを付けるのは、Turbo Driveくんの仕事のちょっとした訂正をしている感じですね。
因みにつけた際のコンソールは下記の様になります
スクリーンショット 2022-12-20 16.13.54.JPG

裏を返せば(この言葉の使い方あってるか?)、訳あってformでdata-turbo: falseと書いてTurbo Driveをキャンセルしている場合は書く必要ないってことですね。

所感

これからアプリにTurboを盛り込んでいくに当たり記事を書くことで不明瞭だった部分が多少クリアになりました。
すごいですねTurboくん。
なんか誤解等あればご指摘いただけるとありがたいです

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0