RadRailsでRuby on Rails開発

これまではviとブラウザだけでRuby on Rails開発を行ってきたが、ちょっと見方を変えてみようと思い前々から気になっていたRadRailsを試してみた。

Welcome to RadRails | Aptana
http://www.aptana.com/rails

RadRailsEclipseベースの開発環境であるAptanaのプラグインとして公開されているRuby on Railsのための統合開発環境である。Aptanaはプロエディションとコミュニティエディションがあるが、コミュニティエディションのほうは無料で利用できる。

準備

RadRailsを使用する少し準備が必要。まずはRubyインタプリタが必要。WindowsならActiveScript Rubyがお勧め。

COM Meets Ruby
http://www.geocities.co.jp/SiliconValley-PaloAlto/9251/ruby/

たぶんgemもデフォルトでインストールされていると思うので、次にrailsをインストール。現在は2.0系が最新だが今回は1.2.3をインストールした(ちなみにウチの環境には既に2.0.2がインストールされていたが諸事情から"gem uninstall rails -v 2.0.2"ししてアンインストールした)。

gem install rails -v 1.2.3 -y

これで準備は完了。Aptanaをインストールし、start pageからRadRailsプラグインをインストールするだけ。これらが完了するとRadRailsパースペクティブが追加されるので、そこで作業を行う。ちなみにrubyインタプリタ自体はAptana起動時に自動的に認識されているものが使用されるはずなので特に設定の必要はなし。明示的に指定したい場合はメニュー -> Window -> preferences.. -> Ruby -> Installed Interceptersで登録すべし。

データベースの作成

とりあえず、MySQLでデータベースを作っとく。

# mysql
> create database todo_development;

railsプロジェクト作成

まずはRailsのプロジェクトを作る。素のrailsを使うときは「rails todo」なんてコマンドを実行するところだが、RadRailsの場合はEclipseらしく、

Ctrl+Shift+N -> [Rails Project] -> project nameを入力(ex; todo) -> Finishボタン押下

と言う感じ。これでRuby Explorer(JavaのPackage Explorerみたいなもん)上にtodoプロジェクトが出来る。とりあえずTODO管理アプリを作ってみよう。

Model作成

TODO管理アプリということで、TODOの内容を管理するモデルクラスから作っていく。画面下のほうに[Generator]ビューがあるのでこれを開く。RoRではこのGeneratorを使っていろいろなクラスの枠組みを作っていく。ちゅーわけで

[model]を選択 -> "Item"を入力 -> [Go]ボタン押下

これでItemというモデルのコードや、そのテストクラス、さらにDB操作用のマイグレーションファイルができます。生成されたitem.rbはこんな感じ。

class Item < ActiveRecord::Base
end

Migrationの修正、実行

ここら辺で、さっき作ったItemモデルに対応するDBのテーブルを作っておく。RoRではMigrationという超クールな機能がある。さっきの自動生成でdb/migrate/001_create_items.rb というコードが生成されたと思うけど、これのことね。これをRuby Editorで開き、以下のように修正。

class CreateItems < ActiveRecord::Migration
  def self.up
    create_table :items do |t|
      t.column :title, :string
      t.column :body, :string
      t.column :complete, :integer
    end
  end

  def self.down
    drop_table :items
  end
end

t.column .. で始まる3行が追加した部分です。これは要は「itemsというテーブルを作って、title,body,completeという名前のカラムを持ったテーブルを作ってね」という処理を行うself.upメソッドを定義しているわけです。一方、self.downメソッドのほうは「itemテーブルを削除してね」というメソッド。で、とりあえず画面下のほうに[Rake Tasks]というビューがあるので、これを開き、

[db:migrate] -> [Go]ボタン押下

する。するとテーブルができるはず。もし「rake aborted!」というエラーメッセージが出た場合は、config/database.ymlを修正する必要があるかも。デフォルトではusername=>rootでpassword=>空、になっていると思う。で、ちゃんとテーブルができてるかどうか確認。

mysql> use todo_development;
mysql> show tables;
                                                          • +
Tables_in_todo_development
                                                          • +
items
schema_info
                                                          • +

はい、出来てるみたいです。おっと、わすれてました。completeというカラムはタスクが完了したかどうかのフラグを表していたんですが、こいつの定義をしておきたいです。今回はcompleteが0だったらタスク未達成、0以外(1とか)だったらタスク達成、というふうにします。だからcompleteの初期値は0になっていたほうが都合がよいですね。というわけでテーブル定義やり直しです。さっきのコードを以下のように直します。

      t.column :complete, :integer, :default=>0

デフォルト値を0に設定しました。次にテーブルを一旦削除したいです。ちなみにRoRのマイグレーションではデータベースの状態を管理しています。さっきのコードは「001_create_items.rb」という名前でしたが、こればバージョンが001であることを示しています。こいつをdb:migrateで実行したわけだから、いまのデータベースのばーじょんは1です。というわけでバージョン0に戻します。

[Rake Tasks]ビューで
[db:migrate] -> "VERSION=0"を入力 -> [Go]ボタン押下

これでテーブルが削除されました。んで、もう一回db:migrateを実行します。VERSIONを指定しない場合は最新バージョン、つまりバージョン1になるわけです。

説明が遅くなりましたが、RoRではRakeというツールを使っていろいろな定型処理を行います。ここにいろんな定型処理(タスク)が定義されているわけです。今回ならMigrationを実行してテーブルの初期化を行う処理が実行されたというわけ。ちなみに[Rake Tasks]ビューを開いた瞬間ちょっと処理待ちがあったとおもうけど、ようはビューを開いたタイミングでRakefileを読み込んで、使用可能なタスク一覧を抽出して、コンボボックスで選択できるようにしていたわけですね。
あとは、さっきMigrationのファイルを編集したときにRuby Editorを使ったわけですが、もちろんコーディング中に[Ctrl+Space]を押せば入力補完が聞きます。さらに、たとえば、" t.column ..."の"column"のところにカーソルを合わせて[F3]を押せば、columnメソッドの定義が記述されたrails本体のコードが開いたりします。これは強力ですね〜。とうぜん自分で定義したメソッドやフィールド上で[F3]を押せば、即座に定義位置にジャンプできるわけで、これはRadRailsならではという感じで、非常に便利です。railsの内部実装を調べるときにも便利。


(コードアシスト。こんなかんじ)

モデルのお試し

さて、ここまででモデルの定義とテーブルの初期化が終わったので、DBアクセスに関する部分は完成です。というわけでちょっと動かしてみましょう。画面上部のメニューの中央あたりに、黒い四角形のアイコンがあります。「script/console」というやつです。このアイコンの右端の小さい▼をクリックして、「script/console (development)」を選択します。すると[Console]ビューが開きます。ここでいろいろと対話的にお試しできるわけですね。さっそく以下のように書いて実行してみます。

>> Item.count
=>0 

これは実際にitemsテーブルにアクセスしにいって、レコードが何行登録されているかをカウントしているんですね。実際には「select count(*) from items;」というSQLが発行されてます。もう少し試してみましょう。

>> item = Item.new(:title=>"task1", :body=>"buy MacBook Air")
>> item.save

これだけでテーブルに新たなレコードが追加できるわけです。いやー、いまさらながらRoRはラクですね〜。確認。

>> item.count
=>1

おおっ。ちなみにちょっとモデルについて整理。今回はモデル名を"Item"としたわけですが、

Generatorで指定したモデル名 => Item
生成されたファイル名 => item.rb
item.rb内で定義されているクラス名 => Item
Migrationで生成したテーブル名 => items

という命名規則の関係になってます。一応おさらいでした。

さくっとコントローラー

そろそろモデルは飽きたので、次にコントローラー。モデルと同じくGeneratorビューで作ってもらいます

[controller]を選択 -> "Main"を入力 -> [Go]ボタン押下

今回のコントローラー名は"Main"としました。ちなみに、時々[controler]を選択するコンボボックスが空になっちゃいます。バグかな?その場合は一旦Generatorビューを閉じて、メニュー->[Window]->[Show Veiw]からもう一度開きなおしましょう。
さて、ここで多分app/controllers/main_controller.rbが生成されているのはずです。コントローラの作成は完了しました。こいつにアクションを定義します。まずはタスクを一覧表示するlistアクションでも作ってみましょう。以下のように定義します。

class MainController < ApplicationController
  def list
  end
end

エレガントなコードですね。listメソッドを追加しただけです。これでおわり。

ビュー

MVCのうち、のこるはビューです。ビューは自分で作ります。Generatorはありません。タスクを一覧するlist画面を作ります。app/views/main/list.rhtmlというファイルを作ります。

app/views/mainフォルダを選択 -> ctrl+Shift+N -> File -> File name:"list.rhtml" ->[Finish]

で、以下のように編集。

<html>
	<body>
		<h1>タスク一覧</h1>
	</body>
</html>

単純な画面やね。ちなみにメニューのボタンを押せば、コントローラー、ビュー、モデル、テスト、ヘルパー、をさくさく切り替えて表示できます。らくだな。

Webアプリとして動かしてみる

Serverビューから「todoServer」を選んで右クリック->Runします。なんか表示されましたね〜。でもコレでは寂しいので、コントローラーとビューを以下のように編集

class MainController < ApplicationController
  def list
    @items = Item.find(:all)
  end
  def add
    item = Item.new(params[:item])
    item.save
    redirect_to :action => "list"
  end
end
<html>
	<body>
		<h1>タスク一覧</h1>
		<ul>
		<% @items.each do |item|%>
			<li><%= item.title %>:<%= item.body %></li>
		<% end%>
		</ul>
		<% form_tag :action=>:add do %>
			タイトル:<%= text_field :item, :title %>
			本文:<%= text_field :item, :body %>
			<%= submit_tag %>
		<% end %>
	</body>
</html>

さて・・

という感じになります。あ、日本語が文字化けするので、environment.rbの先頭らへんに「KCODE='u'」を追加しておいてください。。

テスト

あ、テストするの忘れてた。テストは重要です。RoRではモデルとかコントローラを生成するたびにテストコードの雛形を作っておいてくれます。RadRailsではJUnitのビューっぽいものが現れて、そこでいろいろテストできるんですが、そろそろフロに入りたくなってきたので続きはまた今度。

RadRails雑感

それにしても、なんでこんなrails入門みたいなエントリを書いてしまったのか謎なんですが、まあ暇だったんでしょう。それにしてもRadRailsはなかなかよいね。NetBeans6もちょっと触ってみたんですけど、慣れなのかEclipseベースのRadRailsのほうがしっくりくる感じでした。ちょっともっさりしてる感はあるけど。
さいごにRoRの中で俺が一番好きな機能であるscript/consoleの画面ショットを見ながらお別れです。