= amritaをCGIで使う
== 概略
このドキュメントは、いくつかのサンプルを示してamritaをCGIで使う方法を説明します。
サンプルとしてブックマークのシステムを使います。
このサンプルは下記のURLでデモしています。
http://www.walrus-ruby.org/amrita/
== モデルクラス
最初にモデルクラスを作成します。
:include: sample/cgi/bmmodel.rb
+Item+ というクラスはブックマークの項目に対応します。
このクラスには、group, name, url. という3つのアトリビュートが存在します。
+BookmarkList+ は +Item+ の集まりです。
グループごとにいくつかの +Item+ を保持していて、
ファイルに保存したりロードしたりできます。
このモデルクラスはHTMLに関する処理を含んでいません。
そのため、添付のテストスクリプトのように簡単にユニットテストをすることができます。
== bookmark.cgi
bookmark.cgi はブックマークを表示して、新しいエントリーの入力を受けつけます。
=== テンプレートファイル
bookmark.cgi はこのテンプレートを使用します。
:include: sample/cgi/bookmark.html
=== コード
これが bookmark.cgi のコードです。
:include: sample/cgi/bookmark.cgi
=== フォームの要素を作成する
新しい項目を入力した後のグループの選択肢は、
最後に入力したグループ名がデフォルトに設定されています。
その処理を行なっているのはここです。
:form => {
:group_sel=>e(:select, :name=>"group_sel") {
groups.collect do |g|
if g == selected_group
e(:option, :value=>g, :selected=>"selected") { g }
else
e(:option, :value=>g) { g }
end
end
},
}
このコードが以下のHTMLを生成します。
|
このHTMLがテンプレート内の +group_sel+ に対応する所に挿入されます。
=== コンパイラを使用する
Amrita::TemplateFileWithCache::set_cache_dir(CACHE_PATH)
tmpl = Amrita::TemplateFileWithCache[TEMPLATE_PATH]
tmpl.use_compiler = true
tmpl.expand($stdout, make_model_data(bm,group))
Amrita::TemplateFileWithCache は Amrita::TemplateFile に
コンパイルされたコードをキャッシュして再利用する機能を追加したものです。
+CACHE_PATH+ の中に+TEMPLATE_PATH+ に対応するキャッシュデータが存在し、
テンプレートより新しければ、そのコンパイルされたコードを自動的に再利用します。
注意: このディレクトリは他のユーザが修正できないように確実に設定してください。
現状のバージョンでは、amritaはキャッシュの内容をチェックしません。
もし、ここを修正されるとamritaに任意のコードを実行させることが可能になって非常に危険です。
ここの記述が理解できない場合は、TemplateFileWithCache::set_cache_dirは使用しないでください。
---
== Amrita Script をCGIで使用する
これはAmritaScriptで書かれたブックマークの表示プログラムです。
:include: sample/cgi/bookmark.ams
apache配下で実行するには
* httpd.confを修正してAllowOverride FileInfo と Options ExecCGI を+cgi-bin+ ディレクトリに設定してください
* bin/amshandlerをそのディレクトリにコピーしてください
* .htaccess に以下の記述を追加します。
AddHandler amrita-script ams
Action amrita-script /amrita/cgi-bin/amshandler
---
== bookmark.cgi を mod_ruby で使用する
bookmark.cgi は mod_ruby配下で実行することもできます。
httpd.confに下記の指定を行なってください。
LoadModule ruby_module /usr/lib/apache/mod_ruby.so
RubyRequire apache/ruby-run
Alias /amrita/cgi-bin/ /home/tnaka/cvswork/amrita/sample/cgi/
Options ExecCGI
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
SetEnv AmritaCacheDir /tmp/bookmark # be careful