タイトルに書いたことを実現するのに、Railsだとobserve_fieldっていうのを使うと楽勝なんだけど、これがActiveScaffoldで動的ロードするFormにあるコンボボックスだと、AJAXでロードする情報のなかにJavaScriptを書くことになってしまい動かないっていう罠。

 AJAXのレスポンスをinnerHTMLにぶち込んでごにょごにょとかそういう話もググれたんだけど、ActiveScaffoldだけにその辺自由度なく微妙。

 そこで苦肉の策として、Helperに「連動元コンボボックスのカラム名_form_column(record, field_name)」メソッドをオーバーライドしてSELECTタグを上書きしつつ、onchangeイベントでコンボボックスの中身をJavaScriptで強制書き換えするっていう何ともいえない香ばしい方法で対処する。

 ActiveScaffoldのドキュメントのそれっぽいところには「send_form_on_update_column」とかいかにもなメソッドがあるんだけど、悲しいかな 2.4以降に実装予定ということみたいだ。

 いやActiveScaffold超便利なんですけどね。用意された枠内でやってる分には。

とあるシステムで、ISAPI_Rewriteなるものを使っている。

Ruby on Rails のアプリを開発して Mongrel で稼働させ、Windows Server (IIS6) 経由で呼び出そうというもの。
なんでこんなことをやりたいかっていうと、IISでWindows統合認証を行い、認証済みのユーザだけがアプリを使え、かつWindows認証アカウントをアプリ側でもアカウントとして利用するという構成をとったため。

最初はIIS6 上で FastCGI を使って RoR を動かそうと思ったんだけど、なんか安定してなさそうなので、IIS を Proxy にしようと。(Apache使えよとかいうつっこみはいったん流して)

IISそのものには Proxy 機能は装備されていないのだが、IIS 用のアドインとして ISAPI_Rewrite というものが Helicon Tech 社から提供されている。これはもともと Apache で言うところの mod_rewrite 相当のURL書き換え機能を提供するもの。

ISAPI_Rewrite には2種類のラインナップがあって、完全フリー版では Proxy はできないのだが、シェアウェア版(45日トライアル版あり。$99くらい)だと Proxy としても使える機能がある。

そこで今回はシェアウェア版を購入して、Proxy として使うことにした。

ダウンロード&インストールは極めて簡単なので省略。
で、Mongrel が http://localhost:3000/ で動いており、これをIIS側の http://localhost/ で受けてポート3000に流す。

設定はIISマネージャのWebサイトプロパティにISAPI_Rewrite設定タブがあるので、そこから設定エディタを開き「RewriteProxy /(.*) http\://localhost\:3000/$1 [A,I,U]」と記述。

文法は mod_proxy準拠(微妙に違うところもあるらしいが)。末尾の鍵括弧内はフラグだが、ここに「A」オプションをつけると、認証したユーザアカウント情報を httpヘッダに付加してくれる。たまにWWWで見かける Apache における方法と違うので、最初これが分からなくてあせった。
(落ち着いてドキュメントを読めばちゃんと書いてあったのだが)

あとライセンスキーの設定方法も最初分からなかったが、README を読んだら書いてあった。
インストール時に引数指定する、設定エディタに書く、の2種類があるようだ。

設定してみたが45日後にちゃんと効いているかちょっとドキドキする。