search
LoginSignup
9

posted at

updated at

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

はじめに

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

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

状況

  • Ruby 3.1.1
  • Rails 7.0.2.3

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

スクリーンショット 2022-04-05 3.38.19.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.erbenquetes_controller.rbenquete.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

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

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
What you can do with signing up
9