フォームバリデーションモジュール FormValidator::LazyWayでハマった点

フォームバリデーションモジュール FormValidator::LazyWayでハマった点

FormValidator::LazyWay

フォームのバリデーションルールをアプリケーションで統一出来るモジュールで、便利そうなので試してみたところ FormValidator::LazyWay::Rule::String の nonsymbol_ascii methodでハマったのでメモ。

FormValidator::LazyWay::Rule::String - search.cpan.org

ページの設定サンプルに

  username:
    rule:
      - String#nonsimbol_ascii:
          args:
            allow:
              - '_'
              - '-'

という記述があるのだけれど、これが間違っていて nonsimbol_asciiではなく 正しくは nonsymbol_ascii。

コレただのtypo。

ハマった点はここではない。

FormValidator::LazyWay::Rule::String のソースを見ると

sub nonsymbol_ascii {
    my ($text, $args) = @_;

    if ( ref $args->{allow} eq 'ARRAY' ) {
        foreach my $allow ( @{$args->{allow}} ) {
            $text =~ s{$allow}{}xmsg;
        }
    }

    return $text =~ /^[a-zA-Z0-9]+$/ ? 1 : 0;
}

ってなっているのだけれど、実は第2引数に渡されるものが

{
  'args' => {
            'allow' => [
                       '_',
                       '-'
                     ]
          }
}

となっていて、

ref $args->{allow} eq 'ARRAY'

が成り立たない。

正しい設定は args: は要らなくて

  username:
    rule:
      - String#nonsimbol_ascii:
          allow:
            - '_'
            - '-'

になる。

if ( ref $args->{args}->{allow} eq 'ARRAY' ) { ではないかとも思うけど、他のruleのコード(FV::LW::Rule::Emailとか)を見るとドキュメントが間違っているだけだと思われます。

ちょっとハマったけどこのモジュールは非常に便利そうな感じ。バリデーションのルールがあちこちに散らばるのを防げるので重宝しそうです。