全角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}