with_optionsで複数のバリデーションをまとめる


with_options

with_options 〇〇と書くことで、
複数の情報に対して共通したオプションを付けることが可能。

具体例を用いて比較

「a、b、cそれぞれのカラムが空では保存できない」というバリデーションを設定する場合

class Sample < ApplicationRecord
  validates :a, presence: true
  validates :b, presence: true
  validates :c, presence: true
end

この様に共通のpresence: true(カラムが空では保存できない)といった
validationをひとつひとつに設定していく

class Sample < ApplicationRecord
  with_options presence: true do
    validates :a
    validates :b
    validates :c
  end
end

上記の様にdo〜end内でバリデーションを指定した属性に対して、
値が存在 (presence) しなければならないという制限を一括で設けることができる



一括で設けた上で更に細かなvalidationを設定する

validatesメソッドのオプション
今回はformatオプションに関して

numericalityオプションもあります

  • モデルクラスの中でvalidatesメソッドを使用する際に利用できるオプション
  • 文字列で保存される情報に正規表現によって入力制限をすることが可能
記述方法
format: {with: 正規表現, message: 正規表現にマッチしなかった場合のエラーメッセージ}


今回ここで紹介する正規表現は以下の6種類

正規表現 意味
/\A[ぁ-んァ-ン一-龥々]/ 全角ひらがな、全角カタカナ、漢字
/\A[ァ-ヶー-]+\z/ 全角カタカナ
/\A[a-zA-Z0-9]+\z/ 半角英数
/\A\d{3}[-]\d{4}\z/ 郵便番号(「-」を含む且つ7桁)
greater_than_or_equal_to: 〇〇 〇〇と同じか、それ以上の数値
less_than_or_equal_to: △△ △△と同じか、それ以下の数値

実際に使用する正規表現

  1. 全角ひらがな、全角カタカナ、漢字
  2. 全角カタカナ
  3. 半角英数


実際の記述
class User < ApplicationRecord
  with_options presence: true do
    validates :name, format: { with: /\A[ぁ-んァ-ン一-龥々]/, message: "全角ひらがな、全角カタカナ、漢字で入力して下さい" }
    validates :name_reading, format: { with: /\A[ァ-ヶー-]+\z/, message: "全角カタカナで入力して下さい" }
    validates :nickname, format: { with: /\A[a-z0-9]+\z/i, message: "半角英数字で入力して下さい" }
  end
end
  • with_options presence: true do
    • 値が存在 (presence) しなければならないという制限を一括で設ける
  • validates :name
    • カラム名を指定
  • format: { with: ~~
    • withオプションで与えられた正規表現と属性の値がマッチするかどうか

この様な形で共通のvalidationを設定した上で、
更に細かなvalidationを設定することが可能

更にまとめる

with_optionsにwith_options
with_options presence: true do
  validates :user
  validates :item
  with_options uniqueness: true do
    validates :price
    validates :email
  end
end

ネストして組み合わせると
上記の様によりコンパクトにまとめる事も可能