Class: Kirico::CharsetValidator

Inherits:
ActiveModel::EachValidator
  • Object
show all
Defined in:
lib/kirico/validators/charset_validator.rb

Constant Summary collapse

NUMERIC_RULE =
'0-9'
LATIN_RULE =
'A-Za-z\- '
KATAKANA_RULE =
' ヲ-゚'
KANJI_RULE =
' -〓0-я亜-腕弌-熙'
CHECKS =
{
  numeric: NUMERIC_RULE,
  latin: LATIN_RULE,
  katakana: KATAKANA_RULE,
  kanji: KANJI_RULE,
  all: [NUMERIC_RULE, LATIN_RULE, KATAKANA_RULE, KANJI_RULE].join
}.freeze

Instance Method Summary collapse

Instance Method Details

#check_validity!Object

Raises:

  • (ArgumentError)


57
58
59
60
# File 'lib/kirico/validators/charset_validator.rb', line 57

def check_validity!
  keys = CHECKS.keys & ([options[:accept]].flatten || [])
  raise ArgumentError, ':accept unspecified. Specify the :numeric, :latin, :katakana, :kanji, or :all option.' if keys.empty?
end

#retrieve_error_chars(value, error_chars = []) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/kirico/validators/charset_validator.rb', line 68

def retrieve_error_chars(value, error_chars = [])
  # value.blank? はタブ文字等の場合でも true となるため注意
  return error_chars if value.nil? || value.empty?

  # e-Gov では U+FF0D (FULLWIDTH HYPHEN-MINUS) を許容しているようだ
  # -> Shift_JIS ではなく CP932 が適当
  match = regex(options[:accept]).match(value.encode('CP932'))
  return error_chars if match.nil?

  ch = match.captures[0].encode('UTF-8')
  error_chars << ch
  retrieve_error_chars(value.gsub(/#{Regexp.escape(ch)}/, ''), error_chars)
rescue Encoding::UndefinedConversionError => e
  ch = e.error_char
  error_chars << ch
  retrieve_error_chars(value.gsub(/#{Regexp.escape(ch)}/, ''), error_chars)
end

#validate_each(record, attribute, value) ⇒ Object



62
63
64
65
66
# File 'lib/kirico/validators/charset_validator.rb', line 62

def validate_each(record, attribute, value)
  error_chars = retrieve_error_chars(value)

  record.errors.add(attribute, (options[:message] || :invalid_charset), error_chars: error_chars.join(', ')) unless error_chars.empty?
end