1
1

More than 3 years have passed since last update.

【Rails】Validations

Last updated at Posted at 2020-03-07

Validations

image.png

上記の様な会員登録画面があったときユーザーが文字を入力する際に、
入力されるデータが「全角数字であるか」や「数字以外の文字を入力しているか」等の開発者側が確認したいことがある。

Validationsを使用すると、開発者側が確認したいデータの入力形式をユーザが入力する時点で気づかせてくれる。

文字数の検証

class Member < ApplicationRecord
  # nameの文字数は、1文字から10文字まで
  validates :name,
    length: { minimum: 1, maximum: 10 }
end

上記の様に記載することで「氏名」を入力するフォームに関して、
文字数を1〜10文字までというルール設定ができる。

条件付きで検証

「メールマガジンを受け取る」にチェックを入れた場合のみ、emailの入力を必須にする。

models/member.rb
class Member < ApplicationRecord
  # mail_magazineをチェックしたときは、emailは必須
  validates :email,
    presence: { if: '!mail_magazine.blank?' }
end

!mail_magazine.blank?は「mail_magazine」 にチェックが入ったときのみ真(true)、入らない場合は偽(false)になる。
※「!」が付いているので真偽が逆になる。

つまり、チェックボックスにチェックが付いているときは「presence: true」、チェックが付いていないときは「presence: false」となり、「メールマガジンを受け取るチェックを付けた場合は、メールアドレスを必須にする」が検証できる。

カスタムバリデーション

「length」や「presence」の様にActiveModel::Validationsモジュールが標準で用意している検証機能ではなく、
自分で検証機能を作成する方法がある。

# 数字3桁+ハイフン(-)+数字4桁の形式であることを検証するクラス
class PostCodeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors.add(attribute, 'は、数字3桁+ハイフン(-)+数字4桁の形式で入力してください。') unless value =~ /\A[0-9]{3}-[0-9]{4}\z/
  end
end

class Member < ApplicationRecord 
  # post_codeは、数字3桁+ハイフン(-)+数字4桁の形式
  validates :post_code,
    post_code: true
end

validate_eachメソッドでは「数字3桁+ハイフン(-)+数字4桁」の郵便番号の形式で検証している。
また、ActiveModel::EachValidatorを継承した独自の検証クラスを定義している。

validate_eachメソッドは「length」や「presence」を指定する代わりに「post_code」で指定することができる。

「post_code」とは、検証クラス名の「PostCode」のうち、先頭の大文字「P」は小文字「p」になり、途中の大文字「C」はアンダースコア+小文字「c」になる決まり。

image.png

このメソッドの引数には、上記の情報が渡される。
そこで、valueが「数字3桁+ハイフン(-)+数字4桁」の形式になっていることを、正規表現(/\A[0-9]{3}-[0-9]{4}\z/)を使用して検証する。

1
1
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
1
1