class ActiveModel::Validations::JapaneseValidator

Constants

ALPHABET
CHOONPU
HANKAKU_CHOONPU
HANKAKU_KANA
HIRAGANA
KANJI
KATAKANA
KUHAKU
PREFIX
SUFFIX
SUJI
ZENKAKU_ALPHABET
ZENKAKU_SUJI

Public Instance Methods

validate_each(record, attribute, value) click to toggle source
# File lib/validate_japanese/japanese_validator.rb, line 19
def validate_each(record, attribute, value)
  keys, regexp = build_regexp(options)

  unless value.to_s.match? regexp
    if options[:message]
      record.errors.add(attribute, options[:message])
    else
      record.errors.add(attribute, :invalid_japanese, kind: available_kind(keys, concat: options[:concat]))
    end
  end
end

Private Instance Methods

available_kind(keys, concat: nil, sep: '') click to toggle source
# File lib/validate_japanese/japanese_validator.rb, line 68
def available_kind(keys, concat: nil, sep: '')
  kind = keys.reject {|k| %i(choonpu hankaku_choonpu).include?(k)}.map {|k| I18n.t("validate_japanese.#{k}")}.join(sep)
  kind += concat if concat
  kind
end
build_regexp(options) click to toggle source
# File lib/validate_japanese/japanese_validator.rb, line 33
def build_regexp(options)
  options = options.except(:message, :choonpu, :hankaku_choonpu, :prefix, :suffix, :kuhaku)
  japanese = %i(hiragana katakana hankaku_kana kanji suji zenkaku_suji choonpu hankaku_choonpu)
  keys = []

  if options.empty?
    keys.concat japanese
  elsif options.has_key?(:only)
    keys.concat options[:only]
  elsif options.has_key?(:concat)
    keys.concat japanese
  else
    keys.concat options.select {|_, v| v}.keys
  end

  if (keys.include?(:hiragana) || keys.include?(:katakana)) && keys.exclude?(:choonpu)
    keys << :choonpu
  end
  if keys.include?(:hankaku_kana) && keys.exclude?(:hankaku_choonpu)
    keys << :hankaku_choonpu
  end

  base = keys.map(&method(:const)).join

  if options.has_key?(:concat)
    base += options[:concat].to_s
  end

  [keys, Regexp.new("#{PREFIX}[#{base}]+#{SUFFIX}")]
end
const(name) click to toggle source
# File lib/validate_japanese/japanese_validator.rb, line 64
def const(name)
  self.class.const_get(name.upcase)
end