Catalyst-Plugin-CRUD (4)
先ほどのエントリーまでで、モデル・ビューを作ったので、最後にコントローラです。といっても基本的なコントローラはもう作られていますので、そんなに必要なことはありません。
TinyURL/lib/TinyURL.pm の修正
以下のように修正します。
use Catalyst qw/-Debug ConfigLoader I18N CRUD Static::Simple/;
TinyURL/lib/TinyURL/Controller/TinyURL.pm の修正
自動的に作られたソースは以下のようになっていると思います。
package TinyURL::Controller::TinyUrl; use strict; use warnings; use base 'Catalyst::Controller'; use Class::Trigger; sub default : Private { my ( $self, $c ) = @_; $c->forward('list'); } sub create : Local { my ( $self, $c ) = @_; $c->create($self); } sub read : Local { my ( $self, $c ) = @_; $c->read($self); } sub update : Local { my ( $self, $c ) = @_; $c->update($self); } sub delete : Local { my ( $self, $c ) = @_; $c->delete($self); } sub list : Local { my ( $self, $c ) = @_; $c->list($self); } sub setting { my ( $self, $c ) = @_; my $hash = { 'name' => 'tinyurl', 'type' => 'CDBI', 'model' => 'CDBI::TinyUrl', 'primary' => 'id', 'columns' => [qw(disable long_url)], 'default' => '/tinyurl/list', 'template' => { 'prefix' => 'template/tinyurl/', 'create' => 'create.tt', 'read' => 'read.tt', 'update' => 'update.tt', 'delete' => 'delete.tt', 'list' => 'list.tt' }, }; return $hash; } 1;
- たとえば、新規作成・参照のみ可能で、他のアクションは無効にしたいときは、read, update, delete をコメントアウトするだけです
- setting の中身は見れば大体わかると思います
- $c が渡ってくるので、なにかの条件で返す値を変えるようなこともできます
- ビューに ClearSilver を使う場合は .tt を .cs に変えてください
入力した値をエラーチェックする
とりあえず空の URL は登録させたくないので、エラーチェックを追加しましょう。
- TinyURL/lib/TinyURL/Controller/TinyURL.pm に以下のように追加します
- $hash の中に入力値が入っています
- $c->stash->{create}->{error} に値を入れることで、入力画面にエラーが表示されます
__PACKAGE__->add_trigger(create_check => \&create_check); sub create_check { my ( $self, $c, $hash ) = @_; if (!exists $hash->{long_url} or length($hash->{long_url}) == 0) { $c->stash->{create}->{error} = 'URLが空っぽです。'; } }
エラーメッセージの国際化
先ほどの例では、エラーメッセージが日本語だったので、国際化に対応させてみます。
- 以下のように修正します
$c->stash->{create}->{error} = $c->language('ERROR_URL_IS_NULL');
msgid "ERROR_URL_IS_NULL" msgstr "URLが空っぽです。"
msgid "ERROR_URL_IS_NULL" msgstr "Error: URL is null."
最終的な TinyURL/lib/TinyURL/Controller/TinyURL.pm
package TinyURL::Controller::TinyUrl; use strict; use warnings; use base 'Catalyst::Controller'; use Class::Trigger; sub default : Private { my ( $self, $c ) = @_; $c->forward('create'); } sub create : Local { my ( $self, $c ) = @_; $c->create($self); } __PACKAGE__->add_trigger(create_check => \&create_check); sub create_check { my ( $self, $c, $hash ) = @_; if (!exists $hash->{long_url} or length($hash->{long_url}) == 0) { $c->stash->{create}->{error} = $c->language('ERROR_URL_IS_NULL'); } } sub list : Local { my ( $self, $c ) = @_; $c->list($self); } sub setting { my ( $self, $c ) = @_; my $hash = { 'name' => 'tinyurl', 'type' => 'CDBI', 'model' => 'CDBI::TinyUrl', 'primary' => 'id', 'columns' => [qw(disable long_url)], 'default' => '/tinyurl/list', 'template' => { 'prefix' => 'template/tinyurl/', 'create' => 'create.tt', 'read' => 'read.tt', 'update' => 'update.tt', 'delete' => 'delete.tt', 'list' => 'list.tt' }, }; return $hash; } 1;