RadRailsでRuby on Rails開発
これまではviとブラウザだけでRuby on Rails開発を行ってきたが、ちょっと見方を変えてみようと思い前々から気になっていたRadRailsを試してみた。
Welcome to RadRails | Aptana
http://www.aptana.com/rails
RadRailsはEclipseベースの開発環境である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で登録すべし。
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'」を追加しておいてください。。