初めての JRuby on Rails on Google App Engine

JRubyGoogle App Engineもふれたことがなかったのですが、初めてふれてみました。
やはり、いろいろと失敗しながらも何とか たぶん一番かんたんなRails on GAE/Jにあるサンプルを GAEにデプロイできました ↓ 。

インストール

まずは、インストールから

Java

Mac(leopard)には最初から Java1.5が入っていますが、アップル - サポート - ダウンロード - Java for Mac OS X 10.5 アップデート 1から 最新の Java1.6をインストール。
インストールしただけでは Java1.5のままなので、アプリケション、ユーティリティの Java Preferences.app でJava1.6を最優先に設定。

% java -version                                     
java version "1.6.0_13"
Java(TM) SE Runtime Environment (build 1.6.0_13-b03-211)
Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02-83, mixed mode)
JRuby

たぶん一番かんたんなRails on GAE/Jには、最新のJRubyを(GitHub)からインストールするように書いてありますが、jruby 1.3.1 が最近リリースされたのでこれを入れました。

% cd 適当なディレクトリー
% wget http://dist.codehaus.org/jruby/1.3.1/jruby-bin-1.3.1.tar.gz
% su -
# cd /usr/local
# tar xvzf 適当なディレクトリー/jruby-bin-1.3.1.tar.gz
# ln -s jruby-1.3.1 jruby
# exit
% PATH=/usr/local/jruby/bin:$PATH
% jruby --version        
jruby 1.3.1 (ruby 1.8.6p287) (2009-06-15 2fd6c3d) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_13) [x86_64-java]

Ruby 1.8 と違い gemもインストールされます ^^)

Rails

最新は2.3.3ですが、アプリケーション・テンプレートに合わせ 2.3.2をインストール。
Macには、MRI(CRuby)の環境も入っていますので 毎回 jruby コマンドを指定するのが無難です。

% sudo jruby -S gem install rails -v 2.3.2 --no-ri --no-rdoc

JRuby limited openssl loaded. gem install jruby-openssl for full support. のようなメッセージが出るので

% sudo jruby -S gem install jruby-openssl --no-ri --no-rdoc

それから Javaプログラマーにはお馴染みの WARファイルを作る為のコマンドもインストール

% sudo jruby -S gem install warbler  --no-ri --no-rdoc
Google App Engine SDK for Javaのインストール

http://code.google.com/intl/en/appengine/downloads.htmlからGoogle App Engine SDK for Javaをダウンロドし適当な場所に展開

% cd 適当なディレクトリー
% wget http://googleappengine.googlecode.com/files/appengine-java-sdk-1.2.2.zip
% su -
# cd /usr/local
# unzip 適当なディレクトリー/appengine-java-sdk-1.2.2.zip
# ln -s appengine-java-sdk-1.2.2  appengine-java-sdk
# exit
GAE/J 用の Railsアプリを作る

GAE/J上で動かすには、いろいろな制限や GAEのAPIをアクセスする為のライブラリーが必要になります。これらの設定を行ってくれる アプリケーション・テンプレート が http://gist.github.com/103256.txt に公開されてます。ありがとうございます!

これを使います。この作業は時間がかかります !!

jruby  -S rails rog -m http://gist.github.com/103256.txt

Google App Engine APIライブラリーをアプリにコピー

cp /usr/local/appengine-java-sdk/lib/user/appengine-api-1.0-sdk-1.2.2.jar rog/lib
サンプルプログラムを作る

これは、たぶん一番かんたんなRails on GAE/Jそのままです。

モデル作成

% cd rog
% CLASSPATH=lib/appengine-api.jar jruby -S script/generate bumble_model Comment body created_at

コントロラー作成

% CLASSPATH=lib/appengine-api.jar jruby -S script/generate controller welcome
% cat > app/controllers/welcome_controller.rb 
class WelcomeController < ApplicationController
  def index
    @comments = Comment.all({}, :iorder => :created_at)
  end 

  def comment
    unless params[:body].blank?
      Comment.create(:body => params[:body], :created_at => Time.now) 
    end 
    redirect_to :action => 'index'
  end 
end
^D

ビュー作成

% cat >app/views/welcome/index.html.erb
<html>
<head><title>Rails on GAE</title></head>
<body>
<% form_tag :action => 'comment' do %>
  <%= text_field_tag 'body', '', :size => 50 %>
  <%= submit_tag 'Comment' %>
<% end %>
<ul>
  <%- @comments.each do |comment| -%> 
    <li><%=h comment.body %> (<%= comment.created_at %>)</li>
  <%- end -%> 
</ul>
</body>
</html>
^D
%

ルート設定

% vi config/routes.rb 

    map.root :controller => "welcome"   # を追加

% rm -f public/index.html 
サンプルをローカルで動かす

サンプルの動作確認はローカルで行えます。
まずは WARファイルの作成。 rog.warファイルと tmp/warディレクリーができます。

jruby -S warble war

実行はGAE SDK内の開発用サーバーを使います。起動には時間がかかります

% /usr/local/appengine-java-sdk/bin/dev_appserver.sh tmp/war/ 
2009-08-03 17:33:15.607 java[2026:10b] [Java CocoaComponent compatibility mode]: Enabled
2009-08-03 17:33:15.608 java[2026:10b] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
The server is running at http://localhost:8080/

ブラウザーhttp://localhost:8080/ をアクセスすると 上の画像にようなアプリが動きます。


しかし! 日本語を入れると文字化けします ^^; ・・・・・・・ つづく

.
.