JRuby で Ruby on Rails

Rails難民脱却を目指す
 10分で作る~シリーズでbookmarkアプリだけは何回も作ったけど、そこから先へはいっこうに進めないRails難民と化してはや1年。JRubyが話題になったのを受けて、目先を変えるべく JRubyでRuby on Railsを動かしていくことにする。
自分のレベルは今こんな感じ。
  • しょぼいRubyアプリ(ファイル処理とか)は一応作れる
  • Javaはそこそこわかる
  • Railsはbookmarkアプリ+αレベル
  • RubyのDSLとか、一応どうやってるか知ってる
  • Railsのプラグインとか全然わかりません
  • Railsでどうやって開発するか、ちょっと難しくなると想像つきません
とりあえずは、こういう感じのことを知りたい。
  • 日本語化(必要?不要?)
  • Javaとの連携
  • 複数テーブルのJoin
  • 複雑なSQL
  • メジャーなプラグインの種類と使い方
    • Ajax
    • ログイン
    • DB分散
  • 2.0との関連
  • どういう状況(ビジネス・技術制約や開発プロセス・文化などなど)だとおいしいのか
  • JavaでどうやってRuby処理系を実装しているか
JRubyインストール
 とりあえずはインストールから。まずはJRubyの公式サイトからアーカイブをダウンロード。CodeHausだったとは、今まで知らなかった。今回は、リリースバージョンで最新の、1.0.2をダウンロード。いつまでも1.0にならないと思っていたら、もう1.0.2が出ていたとは。

ダウンロードしたアーカイブは単なるZipなので、展開して適当なディレクトリに配置。うれしいことに(?)、Railsの鬼門(?)である、GemはJRubyの配布アーカイブに含まれているらしい。

自分の場合は、いつも使っている「C:\ProgramFiles\Java」に「JRuby」フォルダを作り、展開したフォルダごと移動。
これから先、%RUBY_HOME%\binのコマンドにはお世話になるはずなので、Javaにならって環境変数に「RUBY_HOME」を登録、Pathに「%RUBY_HOME%\bin」を追加してみる。これで、コマンドプロンプトから「jruby」が動くようになるはず。
C:\Projects\OtherProjects\Rails\bookmark>jruby
You must set JAVA_HOME to point at your Java Development Kit installation
指定されたバッチ ラベルが見つかりません - cleanup
'""' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

む…JRubyは環境変数「JAVA_HOME」がいるのか。さすがJRuby。Javaを感じる。というわけで、環境変数「JAVA_HOME」を設定。どうやら、JAVA_HOMEが指す先はメッセージどおり「JDK」でないといけないらしく、「JRE」では同様のエラーになる。JREしかインストールされていない場合は、JDKをインストールして環境変数に「JAVA_HOME」を指定。
C:\Projects\OtherProjects\Rails>jruby -v
ruby 1.8.5 (2007-11-01 rev 4810) [x86-jruby1.0.2]
よしよし。動く動く。
irbは…
C:\Projects\OtherProjects\Rails>irb
'irb' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
ないらしい。%RUBY_HOME%\binを見ると、irbはjirbという名前らしい。ややこしいから全部オリジナルと同じにしてくれればよかったのに。
C:\Projects\OtherProjects\Rails>jirb
irb(main):001:0> p "test"
"test"
=> nil
irb(main):002:0> exit

よしよし。次はRailsのインストールだ。

Railsのインストール
 Gemを使ってRailsをインストール。なんか、もっとオプションを色々つけた方がいいのかもしれないけど、面倒くさいからとりあえず知ってるコマンドを叩く。
gem install rails
長々とメッセージが出て、あっさりインストール完了。もっとトラブるかと思ったけど、意外と良さそう。

Bookmarkアプリ作成
 あの、有名すぎるBookmarkアプリを作って動作確認してみる。
そう、masuidriveさんの「10分で作るRailsアプリ for Windows」だ。

「C:\Projects\OtherProjects\Rails」フォルダでさっそく、

C:\Projects\OtherProjects\Rails>jruby rails bookmark
Error opening script file: rails (指定されたファイルが見つかりません。)
指定されたファイルが見つかりません。どうも、jrubyからは%RUBY_HOME%\binのrailsは見つからない様子。パス指定しないと動かないのか。
C:\Projects\OtherProjects\Rails>jruby %RUBY_HOME%\bin\rails bookmark
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create components
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application.rb
create app/helpers/application_helper.rb
create test/test_helper.rb
create config/database.yml
create config/routes.rb
create public/.htaccess
create config/boot.rb
create config/environment.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/breakpointer
create script/console
create script/destroy
create script/generate
create script/performance/benchmarker
create script/performance/profiler
create script/process/reaper
create script/process/spawner
create script/process/inspector
create script/runner
create script/server
create script/plugin
create public/dispatch.rb
create public/dispatch.cgi
create public/dispatch.fcgi
create public/404.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
できたできた。MySQLにitemsテーブルを作って…bmuserを作って…
C:\Projects\OtherProjects\Rails>cd bookmark

で、Modelを作ってみる。
C:\Projects\OtherProjects\Rails\bookmark>jruby script\generate model item
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/item.rb
create test/unit/item_test.rb
create test/fixtures/items.yml
create db/migrate
create db/migrate/001_create_items.rb
なんか自動生成重い…?JRubyのが重いのかなぁ。続いてController。
C:\Projects\OtherProjects\Rails\bookmark>jruby script\generate controller item
exists app/controllers/
exists app/helpers/
create app/views/item
exists test/functional/
create app/controllers/item_controller.rb
create test/functional/item_controller_test.rb
create app/helpers/item_helper.rb
重いけど、とりあえず両方できた。「config\database.yml」の設定を変えて…
development:
adapter: mysql
database: bookmark
username: bmuser
password: bmuser
host: localhost
これでよし。
C:\Projects\OtherProjects\Rails\bookmark>jruby script\server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options

で、「http://localhost:3000/」は動作していることを確認。「http://localhost:3000/item」は、

Unknown action

No action responded to index

というわけで、動作せず。コントローラー何も書いてないから当然。「app\controllers\item_controller.rb」を開いて、scaffoldで動くように書き換える。
class ItemController <>もう一回「http://localhost:3000/item」にアクセスすると…うおっ、エラーが出た。

Mysql::Error in ItemController#index

#28000Access denied for user 'root'@'localhost' (using password: NO)

RAILS_ROOT: ./script/../config/..

Application Trace | Framework Trace | Full Trace

Request

Parameters: None

Show session dump

Response

Headers: {"cookie"=>[], "Cache-Control"=>"no-cache"}
データベース接続のユーザー設定がおかしいぞ…?と思ったら、変更したdatabase.ymlを保存していなかったことに気づく。保存してリロード…しても、メッセージ変わらず。いくらRailsといっても、環境設定は起動時に一度しか読まないのね。それじゃあWEBRickを再起動。
C:\Projects\OtherProjects\Rails\bookmark>jruby script\server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-11-13 22:29:18] INFO WEBrick 1.3.1
[2007-11-13 22:29:18] INFO ruby 1.8.5 (2007-11-01) [java]
[2007-11-13 22:29:19] INFO WEBrick::HTTPServer#start: pid=1102920 port=3000
もう一度「http://localhost:3000/item」にアクセスすると…ちゃんと表示された。
JRubyで目先変えて新鮮な気持ちで頑張ろうと思ったけど、意味ないと思えてくるぐらい、Rubyと変わらず普通に動いてしまった。拍子抜けですね。

次のステップ
 次のステップとしては、ちゃんとしたアプリを作る前にscaffoldをスクリプトとして出力して、出力されたソースをながめたり見た目を変えたりしてみる。

コメント