controllerモジュール
- - PR -
このcontrollerは継続すべき処理をハッシュに格納しています。ハッシュのキー、継続IDは十分に大きな乱数で重ならないような値にしています。リクエストにパラメタ名@cont@の継続IDが含まれる場合は、ハッシュに格納されている対応する継続処理を実行します。
継続IDがない場合は、リクエストのパスでedit、updateなどの処理へ分岐します。また、継続処理を簡潔に記述できるように、define-continuationマクロを定義しています。
edit関数で継続を使っていますが、編集用データを読み出した後、編集データを受け取りデータベースに格納する部分へと処理がつながっていくのが分かりやすいと思います。
また、通常のWebアプリケーションでは、player変数の値はセッションを使ってupdateに渡すのですが、そのようなコードはなく、普通のローカル変数として利用できるのがスマートだと思います。
(define-module controller |
| controller.scm |
ORMモジュール
第3回で作ったORM(ORマッパー)もモジュール化しました。また、リクエストパラメータの値でORMインスタンスを更新するset-paramsメソッドを追加しました。ちなみに、リクエストパラメータは、((属性名1 値1) (属性名2 値2) (属性名3 値3) ...)のようなリストです。
(define-module orm |
| orm.scm |
userモジュール
userモジュールでは、<player>クラスを定義しています。ところで、ORMモジュールの中でevalを使ってクラスを再定義していますが、再定義されたクラスは、どのモジュールに定義されるのでしょうか。答えはGaucheユーザリファレンス: 6.18 evalとreplにあるように、evalの第3引数に(interaction-environment)を指定した場合はuserモジュールに定義されます。そのため<player>クラスは、userモジュール内に定義しています。
define-module user |
| user.scm |
テンプレート
このアプリケーションでは、以下の3つのテンプレートを使っています。
- index.html:一覧ページ
- edit.html:編集データ表示ページ
- update.html:編集終了後に一覧ページにリダイレクトするためのページ。今回のWebサーバは、redirect(ステータスコード 302)を戻せないので、このような方法でリダイレクトしています
<html> |
| index.tmpl |
<html> |
| edit.tmpl |
<html> |
| update.tmpl |
まとめ
今回は、Webアプリケーションのコントローラの部分を作ってみました。継続を使うことで、編集画面の表示し、データを受け取り、データベースを更新する処理の流れをスマートに記述できることを見てきました。
また、Gaucheには正規表現や実用的なライブラリがあることで、手軽にWebアプリケーションが書けることも感じていただけたかと思います。
なお、今回のcontrollerのコードは書籍「プログラミングGauche」第26章のコードを参考にしています。
Gaucheには、Kahuaという継続ベースのWebアプリケーション用フレームワークがあります。また、継続ベースのWebアプリケーション用フレームワークとしてはSmalltalkで書かれたseasideが有名です。継続に興味を持たれた方はぜひ調べてみてください。
| 関連リンク: | |
| Kahua http://www.kahua.org/ |
|
| seaside http://www.seaside.st/ |
|
今回作成したWebアプリケーションに必要な全ファイルをzipでまとめたファイルが、ここからダウンロードできます。
3/3 |
| Index | |
| 継続を使ったコントローラを作る | |
| Page1 クロージャ 継続ベースのアプリケーション |
|
| Page2 継続ベースのWebアプリケーションを作る モジュール templateモジュール serverプログラム |
|
| Page3 controllerモジュール ORMモジュール userモジュール テンプレート まとめ |
|
Gaucheでメタプログラミング バックナンバー
- 第1回 ちょっと変わったLisp入門
- 第2回 Gaucheでプログラミング
- 第3回 GaucheでRDBプログラミング
- 第4回 Gaucheでテンプレートエンジンを作る
- 第5回 継続を使ったコントローラを作る
| Gaucheでメタプログラミング |
| Coding Edgeお勧め記事 |
| いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
|
| Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
|
| 貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
|
| Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
|
| ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |
|
TechTargetジャパン
- 派生型でもっと便利にデータを扱う (2012/4/26)
基本型を組み合せて使える派生型を学びます。派生型には構造体、共用体、配列などがあります - 実例で学ぶRailsアプリのテスト方法 (2011/12/22)
具体的なWebアプリを例に簡単なテストを使ったリファクタリングについ
て解説する - Railsの人気テストフレームワーク6選! (2011/8/18)
今回からテストを使ったリファクタリングを解説する。まずはRailsで人
気のあるテストフレームワークをいくつか紹介する - ActiveRecordの更新系操作 (2011/6/27)
Railsのモデル層を担当するActiveRecordを使った登録、更新、削除
など、更新系の機能を中心に見ていきます
|
|

