end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転しました

catalystに触れてみました

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 
                                                      • -
id | text | not null title | text | message | text | Indexes: "memo_pkey" PRIMARY KEY, btree (id)

記事では、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;