FormValidator::Lite でBETWEEN
FormValidator::SimpleにはBETWEENというルールがある。やる事はそのまんま、値が範囲内に収まっているかを見る。
でFormValidator::Liteでもこれをやりたく。
package FormValidator::Lite::Constraint::Between; use FormValidator::Lite::Constraint; rule 'BETWEEN' => sub { my $data = shift; my ($size, $min, $max) = ($data->[0], $data->[1], $data->[2]); unless (defined($size) && $size =~ /^\d+$/ && defined($min) && $min =~ /^\d+$/ && defined($max) && $max =~ /^\d+$/) { die 'invalid args.'; } ($min <= $size && $size <= $max) ? 1 : 0; }; 1;
試す。
use strict; use warnings; use lib "lib"; sub say {print @_, "\n"} use FormValidator::Lite qw/Between/; use CGI; for my $in (0..6) { say "$in でテスト"; my $q = CGI->new; $q->param(in => $in); my $v = FormValidator::Lite->new($q); $v->set_message_data({ param => { in => "セルフサービスで入れたin", }, function => { between => "[_1] でbetweenがerror", }, message => {}, }); my $res = $v->check( in => [[BETWEEN => [$q->param('in'), 2, 5]]], ); if ($res->has_error) { for my $m ($v->get_error_messages) { say " $m"; } } }
んで実行。
% perl main.pl 0 でテスト 1 でテスト セルフサービスで入れたin でbetweenがerror 2 でテスト 3 でテスト 4 でテスト 5 でテスト 6 でテスト セルフサービスで入れたin でbetweenがerror
何か0がスルーされるなと思ってcheckメソッド見たら
if ((not $_) && $rule_name ne 'NOT_NULL') { 1; } else {
となってたので
if ((not defined $_) && $rule_name ne 'NOT_NULL') { 1; } else {
としたらBETWEENも既存のも行けたのでこれでいいや。多分ニーズは無い。
あと同じようにDBの値を見る FormValidator::Simple::Plugin::DBIC::Unique みたいなのもさくっと書いた。