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