全角1文字を半角2文字としてカウントするvalidator

auのメールは、件名が半角100文字、本文が半角10,000文字*1まで。それをvalidateするには、全角1文字を半角2文字としてカウントする必要があります。そこで、RailsのSexy Validationで独自のValidatiorを作ってみました。

ソース

全角文字(1バイト以上)は、半角2文字としてカウントし、maximumに指定した値を超えるかどうかを判定しています。

${APP_ROOT}/lib/length_with_wide_char_validator.rb

class LengthWithWideCharValidator < ActiveModel::EachValidator
  def validate_each(object, attribute, value)
    count = 0 
    value.split(//).each do |v| 
      v.bytesize > 1 ? count += 2 : count += 1
    end 
    object.errors[attribute] << (options[:message] || "is too long (maximum is %d characters)" % options[:maximum]) if count > options[:maximum]
  end 
end

使い方

これを、ActiveRecord::Baseを継承するモデルファイルの先頭で、requireしてやります。

require 'length_with_wide_char_validator'

そして、Sexy Validationで、最大半角文字数(:maximum)を指定。

validates :title, :length_with_wide_char => {:maximum => 100}

余談

2ヶ月ぶりにRailsを触っているので、大ボケかましてるかもしれません。