FormValidator::Simple で同名の複数パラメータを扱う

id:cooldaemon:20070301 で、FormValidator::Simple の Author id:lyokato 様にトラックバックを頂いたので、そのご返信。


Codin’ In The Free World - FormValidator::Simple multivalue fields

こういうのはどうかなーっていう案はあるんだけど。
COUNTっていう特殊Constraintを作って下記のように。

my $result = $fvs->check( [ 
  param1 => [ [COUNT, 1, 5], 'NOT_BLANK' ],
  # 1〜5個の値を持つ 0個や6個だった場合はアウト
 
  param2 => [ [COUNT, 1], 'INT' ],  
  # 値は1つだけ
 
  param3 => [ 'NOT_BLANK', 'INT' ],
  # 省略した場合は [COUNT, 1] として扱う
]);

パラメータの数を管理する事には大賛成です!
ですが、[COUNT, N] を省略した際の処理は・・・[COUNT, 1] として扱わずに、最初のパラメータ値だけ判定するのが宜しいかと思います。

理由としては、CGI 制作者がパラメータとして「name=hoge」 が渡される事を想定しているが、実際は「name=hoge&name=fuga」が渡された場合、COUNT エラーとするか、「name=huga」だけ使うかは、CGI 制作者のポリシーの問題ではないかと思うからです。
(省略時は、"name" が "hoge" になるか、"huga" になるかは、どちらでも良いと CGI 制作者は割り切っていると仮定)

また、FormValidator::Simple 利用者は、[COUNT, N] 省略時であっても、COUNT エラーが発生する事に、気がつき難いのではないかと思います。(エラーメッセージは、"DEFAULT" でカバー可能ですが・・・不親切かなと)

現行バージョンは、下記のコードを書くと・・・

use strict;
use warnings;

use CGI;
use FormValidator::Simple;

$q = CGI->new;

$q->param(param => 1);
$q->append(param => 2);

my $r = FormValidator::Simple->check($q => [param => ['INT'],]);

if(!$r->has_error){
  print 'OK', "?n";
  exit;
}

for my $key ($r->error){
  for my $type ($r->error($key)){
     print "key = $key : type = $type?n";
   }
}

「key = param : type = INT」と出力されます。(ARRAY REF をチェックする為)
これを、OK と出力されるように修正するのが良いかなぁと。

ただ、私の提案差し上げている内容は「$q->append(param => 2);」を「$q->append(param => 'a');」に書き換えても、INT エラーが発生しないので、チェックされなかった値を、その後、何かで使用してしまったら問題がありますが・・・

とりあえず、plugin と言う形で何か書きながら考えてみます。


Codin’ In The Free World - FormValidator::Simple multivalue fields

HTML::WidgetRailsのvalidation、JavaScriptでのクライアントサイドの
realtimevalidationを見ながら色々と考えることはあります。

話はそれますが、messages.yml や、Catalyst::Plugin::FormValidator::Simple::Auto の profiles.yml を、そのまま JavaScript 使えたら DRY で良いなぁと妄想してます。

JavaScript の Validation モジュールでは、下記を試した事があるのですが、毎回、似たようなルールを書くのが、辛いので orz
Mutationevent :: Validate.js :: javascript package to validate various data
Really easy field validation * Dexagogo
Realtime validation using Ajax

早く手を付けたいなぁ・・・。