サブディレクトリ下で Rails 2.3 を動かすときの注意点
久々のサーバー設定関連の備忘録。書いておかないと絶対また後で多大な時間を無駄にする自信がある。
以前作ったRailsアプリをRails 2.3.1で動かそうとしたところ、下のようなエラーが出た。
Mounting Rails at /myapp... /usr/lib/ruby/gems/1.8/gems/activesupport-2.3.2/lib/\ active_support/dependencies.rb:440:in `load_missing_constant': \ uninitialized constant ActionController::AbstractRequest (NameError)
ひたすらググって原因を突き止めた。Railsの最新バージョンである2.3では、MongrelやThinを起動する際 --prefix オプションを使用するとこのようなエラーが出るとのこと。つまり、サブディレクトリ下でアプリを運用するときは今までとは違うやり方を用いる必要があるということだ。2.3からRackが組み込まれたことと関係があるそうな。
Rackはしばらく仕事で使ってきたので、ある程度よく知っているものの、cssやjavascriptなどstaticなファイルを扱うのに少々コツが要るので、諸々の問題を正攻法で解決するのには結構な手間がかかりそうな気がする。
最小限の労力でこれを乗り切るには、 AbstractClass をRailsに再定義してやるのがよさそう。ということで、さらに調べてみると ここ に方法が。
config/initializers ディレクトリに abstract_request.rb というファイルを作り(名前は何でもいいはず)、以下のコードを書き込む。
module ActionController
class AbstractRequest < ActionController::Request
def self.relative_url_root=(path)
ActionController::Base.relative_url_root=(path)
end
def self.relative_url_root
ActionController::Base.relative_url_root
end
end
end
あとは普通にMongrelなりThinなりを起動。
mongrel_rails start -p 3000 -d --prefix=/myapp
しかしこういう仕様変更にいちいち対応するのは非常につらい。MerbとマージされることになっているRails 3.0がいずれ出るのは、楽しみなような怖いような。