只今Ruby勉強中

プログラミングRuby―達人プログラマーガイド

うさぎさんと一緒にRubyの勉強をしているオレの記録。

間違ってる所とかいっぱいあると思いますけど、誰でもコメント出来るので気軽に教えて下さい。

普段は 鷹の島 って所で書いてます。

現在のハマリポイント - yield, succ?, Proc & 後で

2007-02-06 (Tue)

吹き出しバリデータのサーバ側の実装 00:17  吹き出しバリデータのサーバ側の実装 - 只今Ruby勉強中 を含むブックマーク

目ん玉とびでるくらいの人気エントリーになって超びっくりな フォームの入力エラーを吹き出しで教えてくれる JavaScript ですけど、サーバ側でも同じ事するんでクラスを書いてみた。というか半分コピペでほとんど同じ動作するようにしてみただけなんだけど。メールの正当性のチェックは、Perl メモのメールアドレスの正規表現 から持ってきたやつです。

エラーの結果を日本語で返すような処理なんだけど、これってどうなんだろうか…?

class Validater
   def initialize(value, extra = nil)
      @value = value
      @extra = extra
   end

   def check(reg = nil)
      response = nil

      if !reg or !reg.match(/^!/)
         response = rule_input(nil)
      end

      if reg and !response and @value != ''
         mode = reg.sub(/^!/, '').split(/\s+/)
         mode.each do |m|
            m.sub!(/([\d\-]+)$/, '')
            response = __send__("rule_#{m}", $1)
            break if response
         end
      end

      response
   end

   private

   def rule_input(arg)
      '必ず入力して下さい。' if @value == ''
   end

   def rule_mail(arg)
      regexp =
         '(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\\' +
         '\[\]\000-\037\x80-\xff])|"[^\\\\\x80-\xff\n\015"]*(?:\\\\[^\x80-\xff][' +
         '^\\\\\x80-\xff\n\015"]*)*")(?:\.(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x' +
         '80-\xff]+(?![^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff])|"[^\\\\\x80-'  +
         '\xff\n\015"]*(?:\\\\[^\x80-\xff][^\\\\\x80-\xff\n\015"]*)*"))*@(?:[^('  +
         '\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,;:".\\\\\[\]\0' +
         '00-\037\x80-\xff])|\[(?:[^\\\\\x80-\xff\n\015\[\]]|\\\\[^\x80-\xff])*'  +
         '\])(?:\.(?:[^(\040)<>@,;:".\\\\\[\]\000-\037\x80-\xff]+(?![^(\040)<>@,' +
         ';:".\\\\\[\]\000-\037\x80-\xff])|\[(?:[^\\\\\x80-\xff\n\015\[\]]|\\\\[' +
         '^\x80-\xff])*\]))*'

      '不正なデータです。' if @value.match(/\|/) or !@value.match(/^#{regexp}$/o)
   end

   def rule_count(arg)
      c = arg.to_s.split(/\-/)
      return nil if c.size == 0

      min = c[0].to_i
      max = c[1].to_i

      if min == 0 and @value.length > max
         return max.to_s+'文字以内で入力して下さい。'
      elsif max == 0 and @value.length < min
         return min.to_s+'文字以上入力して下さい。'
      elsif min > 0 and max > 0 and (@value.length < min || @value.length > max)
         return min.to_s+'から' + max.to_s+'文字で入力して下さい。'
      end
   end

   def rule_num(arg)
      return '数値で入力してください。' if !@value.match(/^[\d]+$/)

      c = arg.split(/\-/)
      return nil if c.size == 0

      min = c[0].to_i
      max = c[1].to_i

      if min == 0 and @value.to_i > max
         return max.to_s+'以下で入力して下さい。'
      elsif max == 0 and @value.to_i < min
         return min.to_s+'以上で入力して下さい。'
      elsif min > 0 and max > 0 and (@value.to_i < min || @value.to_i > max)
         return min.to_s+'から' + max.to_s+'の間で入力して下さい。'
      end
   end

   def rule_alphabet(arg)
      return 'アルファベット、数字、- 以外は入力出来ません。' if @value !~ /^[a-zA-Z\-\d]+$/
   end
end

password のやつは作ってない。名前を same とかそういうのにしようと考えてるので、その辺がまとまってから作る。

で、使う方法も多分似た同じ。

Validater.new('value').check('count-5')
Validater.new('hogefuga@example.com').check('!mail')

何とかしたい所

各ルールで使わない arg を受け取ってるんだけど、$1 を渡してるからエラーになって消せない。何とかしたい。

エラーメッセージはせめて英語にした方がいいかな…。類似のライブラリが無いか探してみる。何とかしたい。

トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20070206