【rails】Validation(検証)

※本サイトで紹介している商品・サービス等の外部リンクには、アフィリエイト広告が含まれる場合があります。

Validation(検証)

記事を作成・更新するときのルールを決めないといけない

validationとは、決められたルールどおりの入力になっているか検証するもの

主なvalidationの種類

Validation意味
presence入力されているかチェック
length長さをチェック
uniqueness一意であるかチェック
format正規表現と一致するかチェック
numericality数字のチェック

app/models/article.rbに追記していく

class Article < ApplicationRecord
 # ここに書く
end

カラム「title・content」ごとに検証内容「validates」を決めることができる


presence

「未入力なら保存しません」

  validates :title, presence: true
  validates :content, presence: true

presenceは「存在する」の意味

  • :titleにデータが存在していないとだめだよ
  • :contentにデータが存在していないとだめだよ

length

「指定された長さ(文字数)を満たさないと保存しません」

  • minimumで、最低限の文字数(長さ)を指定できる
  • maximumで、最大限の文字数(長さ)を指定できる
  validates :title, length: { minimum: 2, maximum: 100 }
  validates :content, length: { minimum: 10 }
  • :titleは2文字〜100文字に収まってないとだめだよ
  • :contentは最低でも10文字ないとだめだよ


uniqueness

「同じものが他にある場合、保存しません」

同じものが複数あっては困るときに設定する

  validates :content, uniqueness: true

同じ:contentは他にない?一意(ユニーク)であるか?

→ true なら保存される

  • コピペ記事などを防止できる
  • 同じユーザーアカウント名を避けられる
  • 同じメールアドレスを避けられる 等

format

「特定のフォーマットと合ってないと保存しません」

こちらが入力してほしいもの(メールアドレス等)をちゃんと入力されているか確認する

例)タイトルの先頭に「@」があったらだめだよ

  validates :title, format: { with: /\A(?!\@)/ }

バックスラッシュ「\」 → option + ¥


正規表現のチェック方法はツールで確認してみる

リンク:rubular(https://rubular.com/

「\A」は先頭の文字を指定するときに使う

開発でよく使われる正規表現はネット上に公開されているので、がんばって覚えなくても大丈夫


独自のValidationを作る

複数のカラムをあわせたルールを独自で作成してみる

例):title:contentをあわせて、100文字以上ないとだめだよ

  1. 複数形じゃなくて、単数形validateと書くこと
    → これによってrailsの用意したvalidationじゃなくて独自作成したものと判断される
  2. validate_title_and_content_lengthprivateで定義する
  3. unless char_count > 100で、「もし100文字より大きくなかったら」と条件付ける
  4. errors.addで、どのカラムに対してvalidationを追加(エラー表示)するのか指定する
  5. 表示させるエラー内容を書く

コードを書くとこうなる

  validate :validate_title_and_content_length

  private
  def validate_title_and_content_length
    char_count = self.title.length + self.content.length
    unless char_count > 100
      errors.add(:content, '100文字以上で!!')
    end
  end

private部分は↓でも

  private
  def validate_title_and_content_length
    char_count = self.title.length + self.content.length
    errors.add(:content, '100文字以上で!!') unless char_count > 100
  end

charとはcharacterのことで、文字という意味


Validationに反したとき

  • railsが用意したvalidationについては、railsが用意したエラー文言が表示される
  • validateで独自に作成したvalidationのエラーについては、指定したエラー文言が表示される

エラーの表示方法についてはこちらも

#DAY12 #DAY18


2024/10/6 追加