前回は 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もやってみたいけど、できるかどうか。