Adjuster(2004.03.27新規作成。2004.12.31更新。)概要Rubyは、バージョン1.6から1.8にバージョンアップしたときに、CGIライブラリが変更され、非互換な部分が生じています。1.6用に書かれたCGIスクリプトを両方で動かすことができません。この話は、拙著『基礎から学ぶWebデータベースプログラミング』でも解説しています(p.192-193)。Adjusterは、次のことを行うための、小さなスクリプトです。1.8で動くようにする。とち狂ったCGI#[]の挙動を修正する。"cgi/session"を、次のように修正します。代入せずに、次のようにしてください。"cgisup.rb"変更・追加するメソッドクラスCGI[key]コントロール値またはIOを得る。1.8モードでは、次のように動作する。マルチパートではないときは、名前がkeyである最初のコントロールのコントロール値(文字列)を返す。keyコントロールがないときは、""を返す。マルチパートのときは、IO、StringIOまたはTempfileオブジェクトを返す。file_control(key)keyコントロール(ファイルコントロール)のコントロール値を格納するIOオブジェクトを返す。keyコントロールがないときは、nilを返す。マルチパートではないときは、例外RuntimeErrorを投げる。"")ファイルコントロール以外の値を取り出すのに使う。keyコントロールの最初のコントロール値(文字列)またはdefaultで指定される値を返す。マルチパートであるかどうかによらない。いずれでも、値を取得できる。option)セッションが存在するかどうかを調べる。requestにはCGIオブジェクトを、optionにはCGI::Sessionオブジェクトを生成するときに与えるハッシュを与える。option)セッションが存在する場合のみ、Sessionオブジェクトを得る。CGI::Session.sweep(option)セッション情報を保存するファイルを削除する。option["holdtime"](整数で、単位は秒)だけ経過したセッション情報を削除する。update_access_time()セッション情報の最終アクセス時刻を更新する。CGI::Session.sweep()で参照される。nil)メニューコントロールHTMLを生成する。ダウンロード日付2005.01.08内容datesup.rbが必要だったのを修正した。datesup.rbは私の手許で使っているファイル。1.8.2-releaseに対応した。ファイルcgisup-20040327.rb内部の挙動について通常、CGIクラスの[]メソッドでフォームのコントロール値を取り出します。CGI#[]の戻り値は、Rubyのバージョン、formタグのenctype属性値によって、それぞれ次のようになります。コントロール値を読むためのStringIOまたはTempfileインスタンス問題は、次の2点。1.6と1.8の両方で動くスクリプトが書けない。してこういう惚(とぼ)けた失敗をやらかすのか理解できません。ライブラリでは通常、既存のプログラムが動かなくなるような事態を避けるために、すでにあるメソッドの動作は変えず、新しいメソッドを作るものです。基礎的なものであるほど変更は慎重に行わなければなりません。それはともかく、この問題を解決するために、次の方針で臨むことにします。既存のスクリプト用に互換メソッドを用意する。バージョンに依存しない動作のメソッドを新たに用意する。Rubyはすでにあるクラスの定義を書き換えられるのが助かります。1.6用のスクリプトの場合は、1.6と同じ動作になるようにCGI#[]を定義しなおします。1.8.0と非互換な変更が入っている(ふざけているの?)ので、それも潰しておきます。