久々のサーバー設定関連の備忘録。書いておかないと絶対また後で多大な時間を無駄にする自信がある。
以前作った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がいずれ出るのは、楽しみなような怖いような。
[...] そこで、サブディレクトリ下で Rails 2.3 を動かすときの注意点を参考に、試してみたところ、うまくいきました! blogによるプログラミング技術やノウハウの共有は本当に素晴らしいですね。 BPSも本ブログを通じて皆様の役立つ技術やノウハウを共有できるように頑張ります! [...]