スケルトンを作成する

 Helloアプリのときと同じように,MemoアプリもCatalystを使ってスケルトンを作成します。出力結果は長いので,入力するコマンドだけを示します(図15)。ここでは,モデル・ビュー・コントローラのすべてを作っています。


図15●Memoの画面遷移
図15●Memoの画面遷移

 コントローラは,図14で示したアプリの処理に対応するようにEdit,Write,List,Read,Searchの5個を作りました。Rootは最初から作られています。続いて,memo.sqlからsqliteコマンドを使ってmemo.dbを作成します。memo.dbは,データベースの実体になるファイルです。データベースを置くdbというディレクトリを作り,そのなかに配置します。モデルは,memo.dbの場所を指定して,memo_create.plスクリプトを使って作ります。

新規メモ作成・編集

 ここではMemoアプリの処理の中で,「新規メモ作成・編集」と「メモの書き込み」に絞って解説しましょう。

 Catalystは,

  • ブラウザがアクセスしてきたURLを調べる
  • そのURLの処理を行うコントロールとメソッドを見つける
  • メソッドを呼び出す
という順番で処理を行います。

 新規メモ作成・編集のURLはhttp://127.0.0.1:3000/editとしました。Memoアプリの場合,/editの処理を行うコントロールはEdit.pmになります(リスト5)。「/edit」のように何もつかない場合には新規メモ作成で,「/edit/XXXX」のように後にパラメータがついた場合には既存メモの編集にします。


リスト5●/editへのリクエストの処理をするEdit.pmのコード
リスト5●/editへのリクエストの処理をするEdit.pmのコード

 リスト5で,関数editにはRegex('^edit/(¥w+)$')というアトリビュートがついています(1)。これはパスに対する正規表現のマッチングを行うためのものです。このマッチングに成功すると,この関数がCatalystによって呼び出されます。正規表現の「(¥w+)」の部分が,どのページを編集するかを区別するIDになりますが,これは$c->request->snippetsを使って得ることができます(2)。IDが得られれば,あとは,それをキーとして,(3)のようにすれば,対応するデータベースのレコードがハッシュとして得られます。

 $c->stashというのはモデル・ビュー・コントローラ間の通信に使う汎用のハッシュであり,$c->stash->{xxxx}のxxxxはいわば変数名です。xxxxに何を書くかはモデル・ビュー・コントローラ間での決めごとになります。

 例えば,Edit.pmでは,xxxxの部分にtemplate,headline,id,memoなどを使っています。このうちtemplateはTemplate::Toolkitに情報を渡すためであり,これはすでに決められています。

 一方,headline,id,memoは,今回筆者がMemoアプリ用として決めたものであり,edit.ttと対応していさえすれば,どんな名前でもかまいません。この「決めごと」はCatalystでアプリを作る開発者の大切な仕事になります。

 さて,Edit.pmの中で行っているのは,「ブラウザからの要求を元にモデル(データベース)からデータを取り出し,コンテキストの汎用ハッシュ$c->stashに適切な情報を入れる」という処理ですね。コントローラの処理はここまでです。$c->stashから表示に必要な情報を取り出し,レイアウトするのはビューの仕事になります。

 ビューが使うテンプレート・ファイルedit.ttを見てみましょう(リスト6)。


リスト6●新規メモ作成,編集用のテンプレート・ファイル
リスト6●新規メモ作成,編集用のテンプレート・ファイル

 注目すべきポイントは[% %]でくくられた部分です。三つあります。1行目の[% INCLUDE header.tt %]では,別ファイルheader.ttを取り込みます。その次の[% c.stash.id %] では$c->stash->{id}を参照します。form要素の中にある[% memo.message %]で$c->stash->{memo}->{message}を参照します。

 先のサンプルでも紹介したように,[% … %]の部分の書き方は,ビューとして使ったTemplate::Toolkitに従います。詳しく調べたい場合には,Template::Toolkitのマニュアルを参照してください*8

メモの書き込み

 今度はデータベースを更新するWrite.pmを読んでみましょう(リスト7)。


リスト7●データベースを更新するWrite.pm
リスト7●データベースを更新するWrite.pm

 Write.pmが呼び出されるのは /write にアクセスしたときで,/writeはedit.ttに書かれたフォームのaction(アクセス先URL)として指定されています。リスト7の(1)でIDを$c->request->params->{id}で得ます。そして,そのIDを持つレコードをデータベースから探し,なければ新規に作ります(2)。その後,(3)でデータベースを更新し,最後に(4)で$c ->response->redirectを使ってリダイレクトしています。このリダイレクトによって「書き込んだ後,自動的にそのページを表示する」という処理を実現しています。

この先は会員の登録が必要です。今なら有料会員(月額プラン)登録で5月末まで無料!