itproに「Catalyst(前編)」として結城浩さんの記事が掲載されていたので、この記事にあったMemoアプリケーションを自分で書いてみます。
http://itpro.nikkeibp.co.jp/article/COLUMN/20080513/301453/
また、Memoアプリのsrcは日経ソフトウェア(2006年9月号)にもあります。
http://software.nikkeibp.co.jp/
スケルトンの作成
catalystでアプリケーションの雛形を作成するには、catalyst.pl を使用します。
[endo@colinux tmp]$ catalyst.pl Memo created "Memo" created "Memo/script" created "Memo/lib" created "Memo/root" created "Memo/root/static" created "Memo/root/static/images" created "Memo/t" created "Memo/lib/Memo" created "Memo/lib/Memo/Model" created "Memo/lib/Memo/View" created "Memo/lib/Memo/Controller" <略> [endo@colinux tmp]$
viewクラスの作成
model view controller の作成には、「catalyst.pl Memo」でMemo/script/に生成された memo_create.pl を使用します。
TT(Template Toolkit)によるviewクラスをTTという名称で作成するには次のように行います。
[endo@colinux Memo]$ ./script/memo_create.pl view TT TT exists "/home/endo/tmp/Memo/script/../lib/Memo/View" exists "/home/endo/tmp/Memo/script/../t" created "/home/endo/tmp/Memo/script/../lib/Memo/View/TT.pm" created "/home/endo/tmp/Memo/script/../t/view_TT.t"
controllerクラスの作成
記事で紹介されているMemoアプリには、編集(Edit),書込(Write)等の機能がありますが、
これらに該当するcontrollerクラスは次のように作成します。
[endo@colinux Memo]$ ./script/memo_create.pl controller Edit exists "/home/endo/tmp/Memo/script/../lib/Memo/Controller" exists "/home/endo/tmp/Memo/script/../t" created "/home/endo/tmp/Memo/script/../lib/Memo/Controller/Edit.pm" created "/home/endo/tmp/Memo/script/../t/controller_Edit.t" [endo@colinux Memo]$ ./script/memo_create.pl controller Write exists "/home/endo/tmp/Memo/script/../lib/Memo/Controller" exists "/home/endo/tmp/Memo/script/../t" created "/home/endo/tmp/Memo/script/../lib/Memo/Controller/Write.pm" created "/home/endo/tmp/Memo/script/../t/controller_Write.t" <略>
modelクラスの作成...は改めて勉強しましょう
Memoアプリでは記事を保存するmemoテーブルを用意します。
test=# \d memo Table "public.memo" Column | Type | Modifiers
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
記事では、modelの作成を次のように紹介していました。
memo_create.pl model DBIC DBIC 〜
しかし、catalystは開発が早いらしく、次のように実行する必要がありました。
これはcpanにあるドキュメントを参考にしました。
[endo@colinux Memo]$ ./script/memo_create.pl model DB DBIC::Schema \ Memo::Schema create=dynamic dbi:Pg:dbname=test postgres exists "/home/endo/tmp/Memo/script/../lib/Memo/Model" exists "/home/endo/tmp/Memo/script/../t" exists "/home/endo/tmp/Memo/script/../lib/Memo" created "/home/endo/tmp/Memo/script/../lib/Memo/Schema.pm" created "/home/endo/tmp/Memo/script/../lib/Memo/Model/DB.pm" created "/home/endo/tmp/Memo/script/../t/model_DB.t"
ところが、./script/memo_server.pl での動作確認がうまくいきません。
エラー画面で指摘されている find_or_create はDBIx::Class の
methodのはずなので Memo::Model::DB のsrcを確認すると次のようになっていました。
package Memo::Model::DB; use strict; use base 'Catalyst::Model::DBIC::Schema'; __PACKAGE__->config( schema_class => 'Memo::Schema', connect_info => [ 'dbi:Pg:dbname=test', 'postgres', ], );
Catalyst::Model::DBIC::Schema を継承していることが原因であることは分かりますが、そもそもは、先程のmodelの作成方法に問題があったのでしょう。
本来、modelの作成をきちんと調べるべきですが、今回は日経ソフトウェアのサンプルソースを参考に次のようなMemo::Model::DB::Memoクラスを作成し、Writeクラスからはこのクラスを使用するように変更してうまく動作することができました。
package Memo::Model::DB::Memo; use strict; use warnings; use base 'DBIx::Class::Core'; 1;