目次
開発環境
- Ruby:version 3.1.2
- Ruby on Rails:version 7.0.4
- Visual Studio Code:version 1.73.0
- OS:Windows10
Ruby on Railsでバリデーションの実装手順
Ruby on Railsのバリデーションは基本的にモデルに記載されることが多いです。
今回はメモアプリの作成で使用したコードを用いて解説していきます。
モデルにバリデーションを記載する
1 2 3 4 | class Memo < ApplicationRecord validates :title, presence: true, length: { minimum: 2, maximum: 32 } validates :description, presence: true, length: { minimum: 2, maximum: 140 } end |
「validates」の後にカラム名を指定し、その後にバリデーションを設定していきます。
「presence: true」は空白を許可しないという意味になり、「length: { minimum: 2, maximum: 32 }」は属性の値の長さを2以上32以下にするという意味になります。
その他にも様々な制約を設定することができますので、詳しくはRuby on Rails ガイドを参考にすることをおすすめします。
Ruby on Rails ガイド:https://railsguides.jp/active_record_validations.html
ビューにエラーメッセージを記載する
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <div class="col-box-1"> <h2>メモ一覧</h2> </div> <% if @memo_new.errors.any? %> <div class="col-box-1"> <h3><%= @memo_new.errors.count %>件のエラーが発生しました。</h3> <ul> <% @memo_new.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="col-box-3"> <%= form_with model: @memo_new, url: memos_path, local: true, method: :post do |f| %> <div class="memo-header"> <%= f.text_field :title, placeholder: "タイトル", class: "form-box" %> </div> <div class="memo-center"> <%= f.text_area :description, placeholder: "メモ", class: "form-box" %> </div> <div class="memo-footer"> <%= f.submit "作成", class: "btn" %> </div> <% end %> </div> |
バリデーションが行われた後でerrorsインスタンスメソッドを使うと、発生したエラーにアクセスできます。
「オブジェクト.errors.any?」とすることでエラーが発生していれば「true」、エラーが発生していなければ「false」となります。
また、「オブジェクト.errors.full_message」とすることで属性名の冒頭を大文字にした読みやすいメッセージを生成、それをeachメソッドで一つずつ取り出し表示するという流れになります。
コントローラーにエラーが出た場合の処理を記載する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class MemosController < ApplicationController def index @memo_new = Memo.new @memos = Memo.all end def create @memo_new = Memo.new(memos_params) @memos = Memo.all if @memo_new.save redirect_to root_path else render action: "index" end end |
バリデーションが行われた後にエラーが発生した場合、createアクション内で再びrenderメソッドでviewファイルを読み込む設定をします。
上記のようにすることにより、入力されたデータを残したままオブジェクトに格納されたエラー内容も渡すことができます。
CSSにバリデーションによるレイアウトが崩れるのを防ぐ記載する
17 18 19 20 21 22 23 24 25 | * { padding: 0; margin: 0; box-sizing: border-box; color: #696969; font-size: 16px; font-family: sans-serif; list-style-position: inside; } |
「list-style-position」で箇条書きのリストを表示するタグの点をインラインに設定しておきます。
127 128 129 | .field_with_errors { display: contents; } |
また、Ruby on Railsはバリデーションによりエラーが出た箇所に自動的に「field_with_errors」というクラスを持つdivタグが、labelタグやinputタグを囲む仕様になっています。
そのため、「display: contents;」で指定した要素のコンテンツ領域以外は描画されなくすれば解消できます。
おわりに
Ruby on Railsでバリデーションとエラーメッセージについて解説してきましたが、いかがだったでしょうか。
データベースに正しいデータを保存するためにバリデーションは必須とされているため、是非、様々な制限をかけられるように挑戦してみてください。