📧

【Rails7.0】バリデーションのエラーメッセージが表示されない時の解決法

2023/04/15に公開

概要

Rails7.0で進めていると、バリデーションのメッセが出ないという障害にぶつかった。
今回はその原因と解決法をまとめたので、ここに記述する。

問題


  • Ruby 3.1.1
  • Rails 7.0.2.3
    …上記の環境でフォームにバリデーションを設定した際にエラーメッセージが表示されなかった。

原因

Rails7.0からデフォルトでTurboが導入されており、バリデーションのエラーメッセージを表示させるためには下記の記述を追加する必要があるようだ

users_controller.rb
(省略)

def create
    @user = User.new(params.require(:user).permit(:name, :email, :age, :introduction))
    if @user.save
      flash[:notice] = "ユーザーを新規登録しました"
      redirect_to :users
    else
      render :new, status: :unprocessable_entity #こちらを追記しよう
    end
  end

(省略)

Turboとは

TurboHotwireの中心となる要素だ。
TurboはTypeScriptで書かれたサーバー側言語に依存しないフレームワークだが、サーバー側言語との接続にはアダプタを書く必要がある。
Railsで使う場合はすでに用意されていて、便利なヘルパーを使うことができる。このヘルパーを実装するのがgem "turbo-rails"だ。

Hotwireとは

JavaScriptを極力書かずにモダンなアプリケーションを作成するためのフレームワーク。Hotwire自体はライブラリではなく、実態は複数のライブラリを統合したもの。

解決法

createアクションに:newに加えて、下記のstatus: :unprocessable_entityを追記しよう

render :new, status: :unprocessable_entity #こちらを追記しよう


参考

https://qiita.com/P-man_Brown/items/862503a638801fea01e7

まとめ

  • Rails7.0の環境でフォームにバリデーションを設定した際にエラーメッセージが表示されない原因は、デフォルトでTurboが導入されているから
  • 解決法は、createアクションにstatus: :unprocessable_entityを追記すること

Discussion