はじめに
今回は、バリテーションのエラーメッセージがどのようなプロセスを経て、表示されているのかを記事にしてみました。私自身もポートフォリオを作成している中で、ネットの記事などを見て、コードを書いてみて表示させていましたが、実際に裏側でどのようなことが起こっているのか分からずに使っていました。もし、私のようにRails初心者でバリテーションのエラーメッセージを表示させるのは分かったけど、仕組みまでは分かっていない方のお役に立てたら幸いです。
1バリテーションとは
まず、DBにどんなデータでも保存されてしまうと、困ってしまうことがあるかと思います。(例えば、Todoリストであれば、期限やタスクの名前などが無いなど)そこで、一定のルールでデータの正誤性を取り扱いやすくするものがバリテーションです。そして、ActiveRecod、ActiveModelの機能を用いれば簡潔に書くことができます。下記が、実際に使用されたコードです。
app/models/task.rb
class Task < ApplicationRecord
belongs_to :user
validates :expired_at, presence: true#expired_atは空ではない
validates :user_id, presence: true#user_idは空ではない
validates :name, presence: true, length: { maximum: 20 } #nameに20文字数以内の制限を実装
end
このようにすることで、各カラムごとのデータの正誤性がチェックされます。(例えば、expired_atは空ではないなど)
2エラーメッセージを表示させよう
上記のようにバリテーションで条件を付けくわえただけでは、データの正誤性をチェックした際にデータに誤りがあった場合、エラーメッセージは表示されません。表示させるには、「errors」というメソッドでどのようなエラーが起こったのか、どのようなフィールドで発生したのか情報を取得できます。
また、「変数名.errors.full_messages」と記述すると、人間が読みやすい形に成形されたエラーで表示されます。実際に書いてみたコードが下記のコードです。
app/views/tasks/new.html.erb
<div>
<%= form.label :expired_at %><br>
<%= form.datetime_field :expired_at %>
<% if @task.errors.any? %>
<ul>
<% @task.errors.full_messages_for(:expired_at).each do |message| %>
<li><%= message %>
<% end %>
</ul>
<% end %>
</div>
まず、 <% if @task.errors.any? %>で「any?」を付けることで、エラーの有無を判定しています。もし、エラーがあれば、条件内の<%@task.errors.full_messages_for(:expired_at).each do |message| %>
に移動し、<%= message %>が実行されます。
3メソッドを分解しよう
ここからが、実際にエラーメッセージが表示される仕組みのメソッドを分解して解説していきます!ここが一番伝えたかったことです!
<% @task.errors.full_messages_for(:expired_at).each do |message| %
上記のコードは、RubyでいうところのEachメソッドです。eachメソッドの定義は以下です。
配列の変数名.each do |変数名|
このメソッドは配列から要素を順番に受け取り、|変数名|に入れていきます。つまり、@task.errors.full_messages_for(:expired_at)でエラーについての配列が作られて、|message|にエラーが入れられます。当然、エラーの内容によって、配列は変わるので、表示されるエラーの内容は変わります。そして、<%= message %>によってビューにエラーメッセージが表示されるという分けです。実際に表示されている様子が以下です。
4最後に
いかがだったでしょうか?バリデーションエラーの仕組みを理解できたでしょうか?ネットなどでは多くのバリデーションエラーの参考記事が見られます。しかしながら、このメソッドを使えば表示される、ある程度前提の知識が無いと理解できない記事があるのも事実かなと思います。なので、私みたいな初心者は一つずつかみ砕いて理解する必要があると感じ、今回、記事を執筆しました。まだまだ、勉強の身なので、間違っている箇所などありましたら、ご教授いただけると幸いです。
[仕様]ruby 3.3.4/Rails 7.0.8.5
参考文献:すがわらまさのり/前島真一/橋立友宏/五十嵐邦明/後藤優一 (2022)
『パーフェクトRuby on Raila[増補改訂版]』
伊藤淳一 (2024)『プロを目指す人のためのRuby入門[改定2版]』
参考資料:Railsガイド:https://railsguides.jp/active_record_validations.html