| Ruby Earrings |
前回の図を再掲します。

このように CGI を分割すると、システム全体で共通に使うクラスやメソッドを定義したファイルを作りたくなります。ので作ってしまいましょう。記事画面を disp.rhtml、データ保存 CGI を save.cgi、エラー画面を error.rhtml とし、共通に使うファイルを article.rb とします。全て同じディレクトリに置くことにします。

article.rb を disp.rhtml, save.cgi で利用するんだから、
require 'article'
と書こうと思いますよね。だって、同じディレクトリにあるんですもの。
でも、これがそうはうまくいかないのでした(*1)。ガガーン。ナゼでしょう。第1回で書いた設定を思い出してください。
AddType application/x-httpd-eruby .rhtml Action application/x-httpd-eruby /cgi-bin/eruby
繰り返しますと、上記設定は .rhtml という拡張子のファイルをリクエストされたら、そのファイルを /cgi-bin/eruby に通した結果を返す、という意味です。.rhtml は実はタダの入力ファイルであって、実際に動いている CGI は /cgi-bin/eruby 。/cgi-bin/eruby にとっては disp.rhtml が置いてあるディレクトリ、つまり article.rb のディレクトリははるか向こうのほうにあるのです。うまくいかなくて当然です。
対策としては、
article.rb を /cgi-bin にも置く。article.rb を $RUBY/lib ディレクトリに置く。などが考えられますが、同じファイルを2箇所に置いたり、あちこちにファイルが分散したりするのも気持ち悪い。そんな場合はファイルをロードするときの検索パスリストをいじってしまいましょう。require する前にこういう風に書きます。
$:.push File::dirname(ENV['PATH_TRANSLATED']).untaint
ENV['PATH_TRANSLATED']は、ファイルシステムにおける .rhtml ファイルのパスです。eruby がセットしてくれます。一般の CGI で言うところの ENV['SCRIPT_FILENAME'] のようなものです。こうやって検索パスに .rhtml のあるディレクトリを加えることで、article.rb が require/load できるようになります。
(*1) eruby を Action 設定でなく、eRuby HTML ファイルの冒頭に
#!/usr/local/bin/eruby
と書いて普通の CGI として起動している場合には問題ありません。
最後まで読んで頂いてありがとうございました。ここまで5回分、わたくしが実際に eRuby で CGI を書こうとしたときにつまづいたところを順番に述べてきました。これだけの予備知識があれば、カンタンな掲示板ならつまづかずに書けると思います。あとは書くだけです。がんばってくださいね!
エ? あんたの作った掲示板は見せてくれないのか、って? えーとえーと。えとえと。掲示板を作っている最中にこの解説を書き始めてしまい、肝心の掲示板がまだできていません。えーん。すみませーん。そのうち。そのうち作りますから。多分(←それいい加減にやめなさい)。
最初、目次に「Tips 集」という項を作ってしまいましたが、5回分読み返すとあんまり本質的なことは書いてなくて、全部 Tips みたいなものです。掲示板を作り終えたら、要約済み箇条書きのTips ページを作ろうと思います。それではまたそのときにお会いしましょう。
みなさまありがとうございます。いつもお世話になります。今回これを書くのにとくにお世話になったかたがたへ感謝のコトバを。イラナイって言われそうですケド。