0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Rails初学者】バリデーションの基礎についてざっくり理解する -Part3(各種バリデータの詳細)

Last updated at Posted at 2025-12-14

Part2 続き

前回の記事では、Railsの各種バリデータについて一部まとめました📙
今回は残りのRailsが標準で用意しているバリデーションについてまとめていきたいと思います!

validation-flow2.png

バリデーションの種類(続き)

先に今回紹介するバリデーションを一覧にしています✍️

バリデーション名 説明
confirmation 属性の値が対応する確認属性の値と一致していることを検証
comparison 属性の値が他の属性の値と比較条件を満たしていることを検証
format 属性の値が特定の正規表現パターンに一致していることを検証
length 属性の値の長さが特定の条件を満たしていることを検証
numericality 属性の値が数値であることを検証

confirmation

指定した属性の値が、対応する確認属性(属性名_confirmation)の値と一致していることを検証するバリデーションです!
主にパスワードやメールアドレスの確認入力などで使用されます🔐

class User < ApplicationRecord
  validates :password, confirmation: true
end

この場合、password属性に対して確認属性であるpassword_confirmationが自動的に生成され、両者の値が一致しない場合にバリデーションエラーとなります。

ビューテンプレートでは、以下のように確認属性の入力フィールドを追加します。

<%= form_with model: @user do |form| %>
  <%= form.label :password %>
  <%= form.password_field :password %>
  <%= form.label :password_confirmation %>
  <%= form.password_field :password_confirmation %>
<% end %>

注意点

  • 確認属性はデータベースに保存されないため、マイグレーションファイルには含める必要はありません。
  • confirmationバリデーションは、対応する確認属性が存在しない場合には無視されます。(属性名_confirmationnilでない場合のみ、検証される)
  • そのため確認を必須にするには、以下のようにpresenceバリデータも併用することが推奨されます。
class User < ApplicationRecord
  validates :password, confirmation: true
  validates :password_confirmation, presence: true
end

case_sensitiveオプション

confirmationバリデーションでは、case_sensitiveオプションを使用して大文字と小文字の区別を設定できます!
デフォルトではtrueであり、大文字と小文字を区別しますが、falseに設定すると区別しなくなります。

class User < ApplicationRecord
  validates :password, confirmation: { case_sensitive: false }
end

一般的には、このバリデータはifオプションと組み合わせて使用され、初期状態からの変更時にのみ確認を要求することが多いです(例えば、他項目の更新時でパスワードの確認項目には入力が必要ないときにもエラーが出てしまうのを防ぐため)

class User < ApplicationRecord
  validates :password, confirmation: true
  validates :password_confirmation, presence: true, if: :password_changed?
end

comparison

指定した属性の値が、渡された値と比較条件を満たしていることを検証するバリデーションです!

class Event < ApplicationRecord
  validates :start_date, comparison: { less_than: :end_date }
end

この場合、start_date属性の値がend_date属性の値よりも小さいことを検証します。

比較条件には以下のオプションが使用できます。

オプション名 説明 エラーメッセージ
:equal_to 指定した値と等しいことを検証 "must be equal to %{count}"
:greater_than 指定した値より大きいことを検証 "must be greater than %{count}"
:greater_than_or_equal_to 指定した値以上であることを検証 "must be greater than or equal to %{count}"
:less_than 指定した値より小さいことを検証 "must be less than %{count}"
:less_than_or_equal_to 指定した値以下であることを検証 "must be less than or equal to %{count}"
:other_than 指定した値と等しくないことを検証 "must be other than %{count}"

比較対象には、固定値(数値や日付など)や他の属性名をシンボルで指定することができます。

format

指定した属性の値が、特定の正規表現パターンに一致していることを検証するバリデーションです!
主にメールアドレスや電話番号などの形式を検証する際に使用されます📧

withオプションに正規表現を指定して使用します。

class Article < ApplicationRecord
  validates :url, format: { with: /\A[a-zA-Z0-9]+\z/ , message: 'は英数字のみ使用できます' }
end

この場合、url属性の値が英数字のみで構成されていることを検証します。

withoutオプションを使用すると、指定した正規表現パターンに一致しないことを検証できます。

注意点

  • 正規表現は/\A...\z/の形式で指定することが推奨されます。これは文字列全体がパターンに一致することを保証するためです。^$は、1行の冒頭や末尾にマッチさせる場合に使用するべきであるため、文字列で使用しないようにしましょう。

length

指定した属性の値の長さが、特定の条件を満たしていることを検証するバリデーションです!
文字列や配列の長さを検証する際に使用されます📏

class User < ApplicationRecord
  validates :username, length: { minimum: 3, maximum: 20 }
  validates :password, length: { in: 8..16 }
  validates :student_id, length: { is: 10 }
end

この場合、下記をを検証します。

  • username属性の長さが3文字以上20文字以下であること
  • password属性の長さが8文字から16文字の範囲内であること
  • student_id属性の長さがちょうど10文字であること

利用できるオプションは以下の通りです。

オプション名 説明
:minimum 指定した値より大きいまたは等しいことを検証
:maximum 指定した値より小さいまたは等しいことを検証
:is 指定した値と等しいことを検証
:in or :within 指定した範囲内であることを検証

オプションは一度に一つしか利用できませんが、minimummaximumは同時に指定可能です。

numericality

指定した属性の値が数値であることを検証するバリデーションです!🔢
デフォルトでは整数と浮動小数点数の両方を許可しますが、オプションを使用してさらに細かい制御が可能です。また、正負の符号がある場合もマッチします。

class Product < ApplicationRecord
  validates :points, numericality: true
  validates :price, numericality: { only_integer: true }
end

この場合、下記を検証します。

  • points属性の値が数値であること
  • price属性の値が整数であること

以下のオプションが使用できます。

オプション名 説明 エラーメッセージ
:only_integer 整数であることを検証 "must be an integer"
:in 指定した範囲内であることを検証 "must be in %{count}"
odd 奇数であることを検証 "must be odd"
even 偶数であることを検証 "must be even"
:equal_to 指定した値と等しいことを検証 "must be equal to %{count}"
:greater_than 指定した値より大きいことを検証 "must be greater than %{count}"
:greater_than_or_equal_to 指定した値以上であることを検証 "must be greater than or equal to %{count}"
:less_than 指定した値より小さいことを検証 "must be less than %{count}"
:less_than_or_equal_to 指定した値以下であることを検証 "must be less than or equal to %{count}"
:other_than 指定した値と等しくないことを検証 "must be other than %{count}"

only_integertrueに設定したときに、使用される正規表現

/\A[+-]?\d+\z/
  • 先頭に+または-が0回または1回出現
  • 続いて1つ以上の数字(0-9)が続く
  • 文字列全体がこのパターンに一致することを検証

注意点

  • デフォルトでは属性の値がnilは許容されないので、nilを許可したい場合は、allow_nil: trueオプションを使用する。
  • IntegerカラムやFloatカラムでは、空の文字列がnilに変換されるので注意。

Part4へ続く

Railsが用意してくれているバリデーションについて調べてきましたが、これらを自分で用意するとなるとかなり大変なので、Rails様々だなと改めて感じました😌
次回はバリデーションの共通オプションや条件付きバリデーションについてまとめていきたいと思います💪

参考記事

0
0
0

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
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?