CatalystでFormValidator::Simple::AutoでDBIC_UNIQUE使う場合

FormValidator::Simple::Plugin::DBIC::Unique - unique check for DBIC - metacpan.orgを見ると、Catalystの場合は

    # you also can pass resultset object.

    # in catalyst application,
    FormValidator::Simple->check( $q => [
        name => [ ['DBIC_UNIQUE', $c->model('Schema::User'), 'username' ] ],
    ] );

と書いてある。
でもCatalyst::Plugin::FormValidator::Simple::Autoを使ってprofiles.ymlにバリデーションのルールを書く場合は$c->modelとか書けない。

admin/category/do_create:
  name:
    - NOT_BLANK
    - ['LENGTH', 0, 200]
    - ['DBIC_UNIQUE', 'ここになんて書くか', 'name']

スキーマクラスを指定してもcountがないのでダメだし。
わからんけど今日はもう眠いので寝る。

    • -

追記(2007/07/05):
Validatorの外でfindして・・みたいにやらないとダメかと思っていましたがfbisさんのコメントにあるようなやり方の方がスマートですね。
これと、

    unless ($c->form->has_error) {
        my $name = $c->req->param('name');
        if ($c->model('DBIC::Category')->find($name, {key => 'name'})) {
            $c->set_invalid_form(name => 'DBIC_UNIQUE');
        }
        else {
            $c->model('DBIC::Category')->create(
                {
                    name => $name,
                    created_at => DateTime->now(time_zone => 'Asia/Tokyo'),
                }
            );
            $c->res->redirect($c->uri_for('/admin/category/list'));
        }
    }

これの差はデカイと思う。

    unless ($c->form->has_error) {
        $c->model('DBIC::Category')->create(
            {
                name => $c->req->param('name'),
                created_at => DateTime->now(time_zone => 'Asia/Tokyo'),
            }
        );
        $c->res->redirect($c->uri_for('/admin/category/list'));
    }

find_or_newかfind_or_createで一発でできるかと思ったらそれだとDBに存在したのかどうかがわからないのでエラーメッセージが出せない。