概要
- バリデーションを定数にします
- いわゆるカスタムバリデータではないです
メリット
ステークスホルダーはエンジニアとディレクターです。
- ふたりの共通言語をつくれます
- ふたりとも、楽ができます
- 定義ミスが減ります
- 仕様書も実装もシンプルになります
実装
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
解説
-
include OriginValidator
で定数を使えるようにします - あとは、ドキュメントを書くようにバリデーションを定義しましょう
まとめ
simple_formとの相性が良いですね!