コントローラもjrubyc

2007/12/11 |jRuby |comments(0)

Railsアプリのコンパイル実験の続き。今回は controller/helperもやってみて、serverで動作することを確認しました。

前回は modelをjrubycして、consoleで動作確認したのですが、controllerはちょっと事情が違う様子。以下のとおり。

 > cd app/controllers/
 > jrubyc *_controller.rb
 > mv user_controller.rb user_controller.rb_bak
 > ls
  application.rb user_controller.class
  ※とりあえずここでは、application.rbはコンパイルしない。

 > export CLASSPATH=./app/models:./app/controllers
 > jruby script/console
 >> UserController
 => UserController
 >> app.get "http://localhost:3000/user"
 => 404

うぉーん、404。ログを見ると、

 ActionController::RoutingError
   (no route found to match "/user/" with {:method=>:get}):
  /usr/java/jruby-1.1b1/lib/ruby/gems/1.8/gems
   /actionpack-1.13.3/lib/action_controller
    /routing.rb:1292:in`recognize_path'
      :

クラスとしてロードはされているんだけど、routeとして認識されていない。

ソースを追いかけたら、再び「*.rb」のハードコードを発見。

■actionpack/action_controller/lib/routing.rb

 def possible_controllers
   :
  #Dir["#{load_path}/**/*_controller.rb"].collect do |path|
  Dir["#{load_path}/**/*_controller.class"].collect do |path|
   :
  #controller_name.gsub!(/_controller\.rb\Z/, '')
  controller_name.gsub!(/_controller\.class\Z/, '')
   :
 end

と、(勝手に)直してみる。
ここでは、クラスをロードしているわけではなくて、存在するコントローラの名前をただ単にキャッシュしているだけのようだ。

すると、あっさり動く。

 > jruby script/console
 >> app.get "http://localhost:3000/user"
 => 200

script/server を起動してブラウザで見てみたら、ちゃんと動いてました。

helperは、modelとロードの仕組みは同じなので、CLASSPATHに入れておけば問題ナシ。

まとめると、


1)jrubyc で *.rb → *.class コンパイル
  CLASSPATH=./app/models/
        :./app/controllers/
        :./app/helpers
  で、require はしてくれる。

2)でも、Rails本体で、
   .rb でファイルを探しにいく箇所があるから、
   .classでも探すように直す。


ということをコツコツとやっていけば、
 Javaバイトコード on JRuby on Rails
が動くことがわかった。

今度は viewもやってみたいけど、できるかどうか。


コメント

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: