JavaOne の Ruby on Rails のデモ -- サンプルを war にして app server に
配置してみたり、動的更新をしてみたり -- がどうも気にかかっていたので、
以前やりかけてやめていた Ruby on Rails から挑戦。
手近に Linux がないので Windows で試す。日本語の短いデモにしたがって
ActiveScriptRuby で出てくるサイトからダウンロード、インストール。
gem は最初から使えるようで、remote で rails をインストール。
MySQL Manager もあるらしいことは知っていたがずっとコマンドラインだった。
でも使いやすそうなのでインストール。
あとはデモどおりに作っていくとその通りに動く。上記の短い日本語のデモは
単純すぎていまひとつだったが、環境構築に役立った。本家のデモを見ていく
事で view のいじり方の雰囲気がわかった。
同じ事をプロキシの中でやろうとしてみた。gem には --http-proxy オプションが
あるのだがこれがなかなか動かない。gem は gem ファイルからもインストール
できるので rails の gem ファイルをダウンロードしてきてインストールしようと
するが、結構依存するモジュールがあり、エラーを食らってはダウンロード、
インストールを繰り返し、何とか動くところまで持っていけた。
次に Unix 上での動作確認をしたいのだが、対象 OS が OSS に弱くてディスクも
あまりないので、あきらめようとしていたが、JRuby、そして JRuby on Rails も
結構動くらしいことを知る。
適当な JRuby をダウンロード、セットアップすれば、JDK があれば動いてくれる。
そのあとは gem 操作はほぼ同じ。ただし、多くのコマンドは
jruby $JRUBY_HOME/bin/gem ... のように jruby でコマンドラインをはじめる
必要があるようだ。ファイルを一つ一つインストールしたときの gem ファイルが
役に立った。
いろいろなところで書かれてはいたが、Rails はデータドリブンなので
どうしてもデータベースを用意しなければいけないらしい。Controller と
View だけでいろいろ試して見ることができたら便利そうだろうと model
の作成を飛ばしてやってみたが、generate scaffold の中でアクセスに
いってしまう。
そういうものだと割り切ってリモートの MySQL のデータベースを指定。
scaffold もできた。
$ jruby script/generate controller abc
exists app/controllers/
exists app/helpers/
create app/views/abc
exists test/functional/
create app/controllers/abc_controller.rb
create test/functional/abc_controller_test.rb
create app/helpers/abc_helper.rb
$ jruby script/generate scaffold abc
exists app/controllers/
exists app/helpers/
create app/views/abcs
exists app/views/layouts/
exists test/functional/
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/abc.rb
create test/unit/abc_test.rb
create test/fixtures/abcs.yml
#28000Access denied for user 'root'@'localhost' (using password: NO)
$ jruby script/generate scaffold abc
exists app/controllers/
exists app/helpers/
exists app/views/abcs
exists app/views/layouts/
exists test/functional/
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
identical app/models/abc.rb
identical test/unit/abc_test.rb
identical test/fixtures/abcs.yml
/usr/local/jruby-0.9.2/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:155 warning: JRuby does not currently support defining finalizers
create app/views/abcs/_form.rhtml
create app/views/abcs/list.rhtml
create app/views/abcs/show.rhtml
create app/views/abcs/new.rhtml
create app/views/abcs/edit.rhtml
create app/controllers/abcs_controller.rb
create test/functional/abcs_controller_test.rb
create app/helpers/abcs_helper.rb
create app/views/layouts/abcs.rhtml
create public/stylesheets/scaffold.css
---------
rhtml はほとんど JSP の感覚で触れる。リンク周りの書き方が少しわかりづらいが
テーブルの背景色を互い違いにするといったことぐらいであればうろ覚えの
Ruby コードをスクリプトレットのように使って簡単に実現できてしまった。
<table>
<tr>
<% for column in Abc.content_columns %>
<th><%= column.human_name %></th>
<% end %>
</tr>
<% idx=0; %>
<% for abc in @abcs %>
<% if (idx%2)==0; bgcolor="#ffffff"; else ; bgcolor="#cccccc"; end %>
<tr bgcolor=<%= bgcolor %> >
<% for column in Abc.content_columns %>
<td><%=h abc.send(column.name) %></td>
<% end %>
<td><%= link_to 'Show', :action => 'show', :id => abc %></td>
<td><%= link_to 'Edit', :action => 'edit', :id => abc %></td>
<td><%= link_to 'Destroy', { :action => 'destroy', :id => abc }, :confirm => 'Are you
sure?', :method => :post %></td>
</tr>
<% idx = idx + 1 %>
<% end %>
</table>
<%= link_to 'Previous page', { :page => @abc_pages.current.previous } if @abc_pages.curren
t.previous %>
<%= link_to 'Next page', { :page => @abc_pages.current.next } if @abc_pages.current.next %
>
一旦 rhtml を生成した後でテーブルに変更を加えると list 操作には
すぐ反映されるが new, edit には反映されない。これらは _form.rhtml
をインクルードしていて、それ自身はデータベースの構造変更に
追従するわけではない。ここで generate scaffold すると存在する
ファイルに関しては上書きするかどうか聞いてきてくれる。_form.rhtml は
今のところ触っていなかったので、この方法で更新。
$ jruby script/generate scaffold abc
exists app/controllers/
exists app/helpers/
exists app/views/abcs
exists app/views/layouts/
exists test/functional/
dependency model
exists app/models/
exists test/unit/
exists test/fixtures/
identical app/models/abc.rb
identical test/unit/abc_test.rb
identical test/fixtures/abcs.yml
/usr/local/jruby-0.9.2/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/vendor/mysql.rb:155 warning: JRuby does not currently support defining finalizers
overwrite app/views/abcs/_form.rhtml? [Ynaqd] Y
force app/views/abcs/_form.rhtml
overwrite app/views/abcs/list.rhtml? [Ynaqd] n
skip app/views/abcs/list.rhtml
identical app/views/abcs/show.rhtml
identical app/views/abcs/new.rhtml
overwrite app/views/abcs/edit.rhtml? [Ynaqd] n
skip app/views/abcs/edit.rhtml
identical app/controllers/abcs_controller.rb
identical test/functional/abcs_controller_test.rb
identical app/helpers/abcs_helper.rb
identical app/views/layouts/abcs.rhtml
identical public/stylesheets/scaffold.css
このように JRuby on Rails は簡単に動いてしまったが、それを
war ファイルに変換する方法がすぐにわからないので検索してみると
Rails に似た Trails というのがあるらしい。こちらは最初から
java 用で model は java でコーディングする必要があるようだ。
今回は時間切れなので Trails はまたの機会にする。
古い JBoss や Tomcat をはじめて触ってはまりまくったときに比べると
すんなりと動作まで持っていけた。確かに柔軟性にかけそうな部分は
あるし、細かな書き方がいまひとつわからないがあっさりと動いて
くれるともっともっと触りたくなる。こうやって信者になってくのか???
うろ覚えで書いてみたものが動いた。文法は Perl ほどではないが、
どうも好きになれない...
def mathop(n)
rv = 0
i = 0
while i <= n
rv += i
i=i+1
end
return rv
end
printf "result %d\n", mathop(100)
0 件のコメント:
コメントを投稿