Class: Kirico::CharsetValidator
- Inherits:
-
ActiveModel::EachValidator
- Object
- ActiveModel::EachValidator
- Kirico::CharsetValidator
- 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
- #check_validity! ⇒ Object
- #retrieve_error_chars(value, error_chars = []) ⇒ Object
- #validate_each(record, attribute, value) ⇒ Object
Instance Method Details
#check_validity! ⇒ Object
57 58 59 60 |
# File 'lib/kirico/validators/charset_validator.rb', line 57 def check_validity! keys = CHECKS.keys & ([[: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([: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, ([:message] || :invalid_charset), error_chars: error_chars.join(', ')) unless error_chars.empty? end |