Rails 2.2以降 + PassengerでRailsBaseURIが機能しない

某プロジェクトの関係でソースコードを共有する仕組みを考えていたのですが、最近はgithubを使うのがはやりのようです。これまではsubversionを使っていたのですが、よい機会だと思いgitに手をだしてみることにしました。そこでgithubを使おうと思ったのですが、はじめはソースをプライベートの状態で開発を開始したいとの申し出でしたので、githubを前提とするならば有償サービス(最低7ドル、機能対価格表)を利用しなければいけないようでした。そこでgithubクローンで、かつ、rails上で動くオープンソースのgitoriousを試してみることにしました。今回の記事はそのインストールで躓いた部分の備忘録です。

gitoriousにはインストールレシピがあり、ubuntu用チュートリアルを参考に行いました。基本的にそのチュートリアルをなぞればパッケージの導入自体は完了しました。railsをapacheと協調動作させるためのpassenger(いわゆるmod_rails)については、プロジェクト管理ツールのredmineを前回インストールした際に導入済みでしたので、これといって難しいこともありませんでした。
一つ躓いたことといえば、7.4のrakeを使う部分でrake db:create RAILS_ENV=productionをしようとしてもエラーで止まってしまうので、mysqlのコンソールに入り、CRETAE DATABASE gitorious_production;と手動でSQLを発行する必要がありました。

このチュートリアルを元にインストールをすると、gitoriousを動作させるサイトは(バーチャル)ホストのルート(要はhttp://gitorious.naruoka.org/のようなURL)になりますが、それではいやなので、passengerのマニュアルに従って、動作するURLを1階層下に落とす(http://www.naruoka.org/gitorious/のようなURL)ことにしました。RailsBaseURIをapacheの設定ファイル内で宣言するなどすればよいようです。
しかしながら404のページが表示されてしまい、うまく動作しませんでした。redmineのときはRailsBaseURIを設定するだけでルートでなくとも動作したので、思い当たる原因がありません。

しかたがないのでエラーの箇所を突き止めるべく、ソースを弄りだします。まずは404のページだけではデバックのしようがないので、404ページをリンダリングしているrails提供のファイルgitorious/app/controllers/application.rbのApplicationController.render_not_foundメソッドをrender :text => $!.inspect + $@.inspectとして、エラー情報を吐き出させるようにしました。するとgitorious/vendor/rails/actionpack/lib/action_controller内でURLが解決できなく困っているようです。『ActionController RailsBaseURI』をキーワードに検索すると、『RailsBaseURI and relative_url_root』という、まさしく探していた情報が手に入りました。どうやらRailsに付属するActionControllerの仕様が2.2から変更されたために生じた問題のようです。実際、vendor/rails/actionpack/lib/action_pack/version.rbを見てみるとgitorious付属のrailsのバージョンは2.2.2とありますので、どうやらこの原因で間違いがないようです。

解決方法を探ってみると、結局config/environment.rbから呼び出される環境別の設定ファイルconfig/environments/production.rbにおいて、config.action_controller.relative_url_root='/gitorious' とすることで解決できました。散々引っ張っておきながら、これだけで解決してしまうあたりがなんともフレームワークを利用しているという感じです。こんな簡単に解決する話なら、gitorious本家のマニュアルにも書いておいて欲しいものです。

February 25, 2009 09:12 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク

コメント

コメントする