LoginSignup
6
4

More than 5 years have passed since last update.

Railsのバリデーションをパターン化してConcernに定義すると、設計者とコミュニケーションが捗る

Last updated at Posted at 2016-09-17

概要

  • バリデーションを定数にします
  • いわゆるカスタムバリデータではないです

メリット

ステークスホルダーはエンジニアとディレクターです。

  • ふたりの共通言語をつくれます
  • ふたりとも、楽ができます
  • 定義ミスが減ります
  • 仕様書も実装もシンプルになります

実装

module OriginValidator
  extend ActiveSupport::Concern
  # すべてのバリデーションパターンを網羅してません
  # つくりすぎても、キャッチアップが大変になるので、
  # よくつかいそうなものだけ、フォーマットに従って定義しましょう

  # 文字列
  STRING_SHORT          = { length: { minimum: 0, maximum: 50 },      allow_blank: true } # 0~50文字
  STRING_SHORT_REQUIRED = { length: { minimum: 1, maximum: 50 },      presence:    true } # 1~50文字 必須
  STRING_LONG           = { length: { minimum: 0, maximum: 100 },     allow_blank: true } # 0~100文字
  STRING_LONG_REQUIRED  = { length: { minimum: 1, maximum: 100 },     presence:    true } # 1~100文字 必須

  TEXT_SHORT          = { length: { minimum: 0, maximum: 1000 },    allow_blank: true } # 0~1000文字
  TEXT_SHORT_REQUIRED = { length: { minimum: 1, maximum: 1000 },    presence:    true } # 1~1000文字 必須
  TEXT_LONG           = { length: { minimum: 0, maximum: 10000 },   allow_blank: true } # 0~10000文字
  TEXT_LONG_REQUIRED  = { length: { minimum: 1, maximum: 10000 },   presence:    true } # 1~100000文字 必須

  # 整数
  integer_short = { numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 99 } }
  integer_long  = { numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than_or_equal_to: 999999999 } }
  INTEGER_SHORT          = integer_short.merge(allow_blank: true) # 0~99まで
  INTEGER_SHORT_REQUIRED = integer_short.merge(presence: true)    # 0~99まで 必須
  INTEGER_LONG           = integer_long.merge(allow_blank: true)  # 0~99億まで
  INTEGER_LONG_REQUIRED  = integer_long.merge(presence: true)     # 0~99億まで 必須

  # 小数
  float_short = { numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 99 } }
  float_long  = { numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 999999999 } }
  FLOAT_SHORT          = float_short.merge(allow_blank: true) # 0~99まで
  FLOAT_SHORT_REQUIRED = float_short.merge(presence: true)    # 0~99まで 必須
  FLOAT_LONG           = float_long.merge(allow_blank: true)  # 0~99億まで
  FLOAT_LONG_REQUIRED  = float_long.merge(presence: true)     # 0~99億まで 必須
end

使い方

class User
  include OriginValidator
  validates          :name,  STRING_LONG_REQUIRED
  validates      :business,  STRING_SHORT
  validates        :income,  INTEGER_SHORT_REQUIRED
end

解説

  1. include OriginValidator で定数を使えるようにします
  2. あとは、ドキュメントを書くようにバリデーションを定義しましょう

まとめ

simple_formとの相性が良いですね!

6
4
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
6
4