はじめに
 本記事は、プログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。
Rails7.0でバリデーションのエラーメッセージが表示されない時の解決法
状況
- Ruby 3.1.1
- Rails 7.0.2.3
上記の環境でフォームにバリデーションを設定した際にエラーメッセージが表示されませんでした。
以下のような記述をしていました。
:
:
  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
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
 <div class="field">
    <%= form.label :request %>
    <%= form.text_field :request %>
 </div>
  <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_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を追記することで解決しました。
  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
Rails7.0からデフォルトでTurboが導入されており、バリデーションのエラーメッセージを表示させるためには上記の記述を追加する必要があるようです。


