Part2 続き
前回の記事では、Railsの各種バリデータについて一部まとめました📙
今回は残りのRailsが標準で用意しているバリデーションについてまとめていきたいと思います!
バリデーションの種類(続き)
先に今回紹介するバリデーションを一覧にしています✍️
| バリデーション名 | 説明 |
|---|---|
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バリデーションは、対応する確認属性が存在しない場合には無視されます。(属性名_confirmationがnilでない場合のみ、検証される) - そのため確認を必須にするには、以下のように
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
|
指定した範囲内であることを検証 |
オプションは一度に一つしか利用できませんが、minimumとmaximumは同時に指定可能です。
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_integerをtrueに設定したときに、使用される正規表現
/\A[+-]?\d+\z/
- 先頭に
+または-が0回または1回出現 - 続いて1つ以上の数字(0-9)が続く
- 文字列全体がこのパターンに一致することを検証
注意点
- デフォルトでは属性の値が
nilは許容されないので、nilを許可したい場合は、allow_nil: trueオプションを使用する。 - IntegerカラムやFloatカラムでは、空の文字列が
nilに変換されるので注意。
Part4へ続く
Railsが用意してくれているバリデーションについて調べてきましたが、これらを自分で用意するとなるとかなり大変なので、Rails様々だなと改めて感じました😌
次回はバリデーションの共通オプションや条件付きバリデーションについてまとめていきたいと思います💪
参考記事
