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に存在したのかどうかがわからないのでエラーメッセージが出せない。