タイトルに書いたことを実現するのに、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日後にちゃんと効いているかちょっとドキドキする。

すでに導入しているSubversionと連携するチケット管理システムの導入を検討しておったのですが、Tracを試すも微妙に日本語化が大変だったりした割に連携部分でなんかトラブったため、目先を変えてRedmineを試そうと。

1.とりあえず新しいRubyを入れとく

# wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p72.tar.gz
# tar xvfz ruby-1.8.7-p72.tar.gz
# cd ruby-1.8.7-p72
# ./configure
# make
# make install

WebARENAにもともと導入されているRuby(1.8.1)は/usr/binにいますが、新しいRubyは/usr/local/binにインストールされます。(場合によってはpathを張りなおしてbashリロードが必要かも)

2.Rubygemsを入れる

# wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz
# tar xvfz rubygems-1.3.1.tgz
# cd rubygems-1.3.1
# ruby setup.rb

3.Ruby on Railsを入れる

RedmineはRoR上で作られたアプリケーションです。

# gem install rails --include-dependencies

4.Redmine

# wget http://rubyforge.org/frs/download.php/49319/redmine-0.8.0.tar.gz
# tar xvfz redmine-0.8.0.tar.gz
# cd redmine-0.8.0/config
# vi database.yml
--------------------
(追加)
production:
adapter: sqlite3
dbfile: db/redmine.db
--------------------
# rake db:migrate RAILS_ENV=production
(in /root/redmine-0.8.0)
rake aborted!
no such file to load -- openssl

(See full trace by running task with --trace)

opensslがロードできませんエラーになっちゃいました。

5.RubyのOpenSSL拡張を確認する

http://d.hatena.ne.jp/hata-hata/20080416を参考にさせていただきました。

# cd ~/ruby-1.8.7-p72/ext/openssl
# ruby extconf.rb
=== OpenSSL for Ruby configurator ===
=== Checking for system dependent stuff... ===
checking for t_open() in -lnsl... no
checking for socket() in -lsocket... no
checking for assert.h... yes
=== Checking for required stuff... ===
checking for openssl/ssl.h... no
=== Checking for required stuff failed. ===
Makefile wasn't created. Fix the errors above.
(ssl.hがないようなので、OpenSSLパッケージのバージョンを確認してソースコードをインストール)
# rpm -qa | grep openssl
openssl-0.9.7a-43.17.el4_7.2
# yum install openssl-devel-0.9.7a-43.17.el4_7.2
# ruby extconf.rb
(Makefileが生成されればok)
# make
# make install
# ruby -r openssl -e ""
(何も表示されなければok)

6.Redmine(再)

# cd ~/redmine-0.8.0/config
# rake db:migrate RAILS_ENV=production
# rake load_default_data RAILS_ENV=production
(対話式でロケールをたずねてくるのでjaでこたえる)

7.とりあえずRedmineを起動してみる

RoRアプリに付属しているWebサーバWEBrickを使ってとりあえず動作確認をする。

# cd ~/redmine-0.8.0
# script/server -e production

ポート3000にアクセスしてRedmineログインページが表示されればok

8.RoRとapacheを連携させる

Redmineをapacheで動かす設定。まずRoRをapache上で動かすためのモジュール、Phusion Passengerを入れる。

# gem install passenger
# passenger-install-apache2-module
・・・
Checking for required software...

* GNU C++ compiler... not found
* Ruby development headers... found
* OpenSSL support for Ruby... found
* RubyGems... found
* Rake... found at /usr/local/bin/rake
* Apache 2... found at /usr/sbin/httpd
* Apache 2 development headers... not found
* Apache Portable Runtime (APR) development headers... found
* Apache Portable Runtime Utility (APR) development headers... found
* fastthread... found
* rack... found

Some required software is not installed.
But don't worry, this installer will tell you how to install them.

Press Enter to continue, or Ctrl-C to abort.
・・・
おっと今度はg++とapacheのソースコードがないと。

# yum install gcc-c++
# yum install httpd-devel
# passenger-install-apache2-module

9.apacheの設定

Phusion Passengerを入れた時にコンソールにhttpd.confの設定例を表示してくれるので、それを参考に適当に設定。公開するディレクトリのPermissonに注意ね。以上