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

## はじめに
　本記事は、プログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## Rails7.0でバリデーションのエラーメッセージが表示されない時の解決法
### 状況
- Ruby 3.1.1
- Rails 7.0.2.3

上記の環境でフォームにバリデーションを設定した際にエラーメッセージが表示されませんでした。

![スクリーンショット 2022-04-05 3.38.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9b44385d-8128-bad3-945c-2def0209ff33.png)

以下のような記述をしていました。

```enquetes_controller.rb
:
:

  def create
    @enquete = Enquete.new(enquete_params)
    if @enquete.save
      redirect_to @enquete, notice: I18n.t('successes.submit', name: @enquete.model_name.human)
    else
      render :new
    end
  end

  private
    def set_enquete
      @enquete = Enquete.find(params[:id])
    end

    def enquete_params
      params.require(:enquete).permit(:name, :mail, :age, :request)
    end
end


```
```common_module.rb
module CommonModule
  extend ActiveSupport::Concern

  included do

    validates :name, presence: true, length: { maximum: 16 }

    validates :mail, presence: true, length: { maximum: 64 }, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }, uniqueness: { case_sensitive: false }

    validates :age, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 100 }

    validates :request, length: { maximum: 150 }
  end
end
```
```_form_request.html.erb
 <div class="field">
    <%= form.label :request %>
    <%= form.text_field :request %>
 </div>
```
```_form_name_mail_age.html.erb
  <div class="field">
    <%= form.label :name %>
    <%= form.text_field :name, maxlength: 16 %>
  </div>

  <div class="field">
    <%= form.label :mail %>
    <%= form.text_field :mail, maxlength: 64 %>
  </div>

  <div class="field">
    <%= form.label :age %>
    <%= form.number_field :age, in: 0 .. 100 %>
  </div>
```
```_form.html.erb
<%= form_with(model: enquete, local: true) do |form| %>
  <% if enquete.errors.any? %>
    <ul>
    <% enquete.errors.full_messages.each do |message| %>
      <li><%= message %></li>
    <% end %>
    </ul>
  <% end %>

  <%= render 'concerns/form_name_mail_age', form: form %>

  <%= render 'concerns/form_request', form: form %>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>
```

ログを見ても特に異常はなかったため、`_form.html.erb`と`enquetes_controller.rb`に`enquete.errors.any?`の値を確認するための記述を追加し確認を行いました。

結果は、
`enquetes_controller.rb`のcreateアクションでは`true`
`_form.html.erb`では`false`でした。

### 解決法
`enquetes_controller.rb`のcreateアクションに以下のように`status: :unprocessable_entity`を追記することで解決しました。

```enquetes_controller.rb
  def create
    @enquete = Enquete.new(enquete_params)
    if @enquete.save
      redirect_to @enquete, notice: I18n.t('successes.submit', name: @enquete.model_name.human)
    else
      render :new, status: :unprocessable_entity
    end
  end
```
![スクリーンショット 2022-04-05 3.38.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/2903686d-d5cf-c559-ca42-0c53e2c220c4.png)

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

https://techracho.bpsinc.jp/hachi8833/2021_12_16/114472

https://github.com/hotwired/turbo-rails

https://zenn.dev/satococoa/articles/95122320f1ca87