先日なんとか動くところまでこぎつけたので、練習がてら超簡単なWebアプリを作ってみようと思う。
とりあえず、従業員を管理するシステムにしてみよう。
従業員は、従業員番号と従業員名と入社年月日を持ってるという軽いノリです。
早速NetBeansを起動!!Railsプロジェクトを作る前に、とりあえずデータベースだけ作成しておきます。
使用するデータベースは、NetBeansにくっついてくてるJavaDBを使うことにるす。とりあえず起動をかける。
起動すると、NetBeansの出力ウィンドウにメッセージが表示される。それを確認したら、DBの作成だ。
DBもJavaDBで右クリックしてCreate DatabaseでOK。
empmng_developmentとempmng_testという2つのデータベースを作成する。
DBを作成すると、作成したDBに対する接続の設定も追加される。
ここに接続をあらかじめ登録しておくと、Railsのプロジェクトを作るときに楽になる。
ということで、Railsのプロジェクトを作成する。新規プロジェクトからRuby on Rails Applicationを選択する。
プロジェクト名をempmngにして、次へ。
データベースを、どれにするか聞かれるので、さっき作っておいたDBを選択する。
ついでに、下のほうにあるJDBCを使用するという部分にチェックを入れておくのも忘れない。
Finish!をクリックするとRuby on Railsのプロジェクトがもっさりと作られる。
まぁNetBeans5.5までのもっさり感に堪えてきてる人にとっては超高速に感じるくらいになってる。
いっぱいファイルとか作ってるからこんなもんなんだろう。
下が作られたプロジェクトと、DBへの接続情報のかかれたdatabase.yaml
いい感じ。
ここからやっとプログラムつくりに入る。
まずは、アプリケーションの土台となるモデル。モデルが無いことには個人的には始めにくい。
プロジェクト名あたりで右クリックして、Generateを選択する。
モデルのジェネレータを選択して、引数にEmployeeを入力する。
ここに入力したものの複数形がデータベースのテーブル名になるという仕様だ。
これも完了を押すと、Outputウィンドウにつらつらと生成されたものが表示される。
これで、モデルが出来上がり。
最初のほうで決めたけど、この従業員は、従業員番号と従業員名と入社年月日を持っているということだった。
なので、これを作りにかかる。
Database Migrationsのmigrateの下に001_create_employees.rbというファイルができている。
ここに、テーブルが持ってるカラムの定義を足す。
さっきのGenerateで、したのような感じのファイルが出来上がってると思う。
class CreateEmployees < ActiveRecord::Migration
def self.up
create_table :employees do |t|
t.timestamps
end
end
def self.down
drop_table :employees
end
end
ここのself.upメソッドにカラムの定義を追加する。
class CreateEmployees < ActiveRecord::Migration
def self.up
create_table :employees do |t|
# 従業員番号!nullはだめよ
t.column :emp_no, :string, :null => false
# 従業員名!nullはだめよ
t.column :name, :string, :null => false
# 入社年月日!nullはだめよ
t.column :ent_date, :date, :null => false
t.timestamps
end
end
def self.down
drop_table :employees
end
end
これで、モデルのカラムとかの指定ができたので、DBにテーブルを作りにかかる。
テーブルを作るのは、さっき書いた001_create_employees.rbの定義に従ってさくっとやってくれる。
プロジェクト名あたりで右クリックして、Migrate DatabaseのTo Current Versionを選ぶとデータベースにテーブルを作ってくれる。
楽チン。
Outputウィンドウには、下のように表示される。
(in C:/Users/Kazuki/Documents/NetBeansProjects/empmng)
== 1 CreateEmployees: migrating ===============================================
-- create_table(:employees)
-> 0.2434s
-> 0 rows
== 1 CreateEmployees: migrated (0.2439s) ======================================
ちなみに、これは開発用のデータベースempmng_developmentに作成されている。
本当に作成されてるのか見てみると…
ばっちりできてる。
ここらへんで、簡単に動きをみてみようと思う。
プロジェクト名で右クリックしてRails Consoleを選択すると、jirbが立ち上がる。
ここにぱちぱちと打ち込んでいく。
?> emp = Employee.new :emp_no => 'A001', :name => 'Tanaka Taro', :ent_date => Date.today
=> #<Employee id: nil, emp_no: "A001", name: "Tanaka Taro", ent_date: "2008-05-03", created_at: nil, updated_at: nil>
>> emp.save
=> true
これでデータの登録完了!引き続き、ちゃんと登録できたか見てみる。
これは、findメソッドでできる。
>> Employee.find :all
=> [#<Employee id: 6, emp_no: "A001", name: "Tanaka Taro", ent_date: "2008-05-03", created_at: "2008-05-03 14:49:57", updated_at: "2008-05-03 14:49:57">]
これもOKだ。続いて、Tanaka TaroをTanaka Ichiroに変えてみる。
>> emp = Employee.find 6
=> #<Employee id: 6, emp_no: "A001", name: "Tanaka Taro", ent_date: "2008-05-03", created_at: "2008-05-03 14:49:57", updated_at: "2008-05-03 14:49:57">
>> emp.name = "Tanaka Ichiro"
=> "Tanaka Ichiro"
>> emp.save
=> true
>> Employee.find :all
=> [#<Employee id: 6, emp_no: "A001", name: "Tanaka Ichiro", ent_date: "2008-05-03", created_at: "2008-05-03 14:49:57", updated_at: "2008-05-03 14:53:09">]
ちゃんとDBへの読み書きができてる。素敵だ。
続いて、コントローラを作ろうと思う。コントローラの名前もモデルにあわせてEmployeesで作る。
Generateでcontrollerを選択して、Employeesと入力してOKを押す。
そうすると、したのようにコントローラの雛形が出来上がってる。
class EmployeesController < ApplicationController
end
ここにコードを書いていく。
とりあえず、indexというメソッドを定義して、それを動かしてみよう。
コントローラでは、renderメソッドで、レスポンスに何を返すか色々指定できるっぽい。
とりあえず、お約束的なHello worldみたいなのを書いてみた。
class EmployeesController < ApplicationController
def index
render :inline => "Hello Rails Application"
end
end
さて、ついにWebアプリケーション!!F6を押してWEBrickを起動する。
ブラウザのアドレスに、http://localhost:3000/employeesと入力してみると下のように、ブラウザに文字がちゃんと表示された。
よきことかな。
調子にのって、Employeesテーブルの中身を表示してみた。
class EmployeesController < ApplicationController
def index
# 全員取得
employees = Employee.find :all
# 名前のリストを取得
name_list = employees.collect(&:name).join
# 名前を画面に出してみる
render :inline => "Hello #{name_list}"
end
end
まだTanaka Ichiroさんしか入ってないので、それが表示されるだけだけど、ちゃんと動いてる。
お次はViewを作ろう。今のままだと、Controllerで見た目まで作ってる。本来Ruby on RailsではViewがこれを担当する。
よく見てみると、ControllerのジェネレータにViewsという入力欄があった。
もう一度コントローラのジェネレータを立ち上げて、NameにEmployees、Viewsにindexと指定してOKを押す。
ジェネレータは、結構かしこいので、すでにあるものは手をつけずに、新たに作る必要のあるものだけ作ってくれるみたいだ。
今回は、下に表示させてる4つのファイルを生成してくれた。(ほかにもあるけど、今は使わない)
Viewができたので、コントローラからrenderメソッドを消す。
Railsは、デフォルトだとコントローラとアクションの名前から自動的にViewを対応付けてくれる。
今回の例だとemployees_controllerのindexアクションなのでViewsの下にあるemployees/index.html.erbが対象になるっていう寸法だ。
ためしにコントローラのrenderメソッドをコメントアウトして実行すると、employees/index.html.erbの中身が出ることが確認できる。
class EmployeesController < ApplicationController
def index
# 全員取得
employees = Employee.find :all
# 名前のリストを取得
name_list = employees.collect(&:name).join
# 名前を画面に出してみる
# render :inline => "Hello #{name_list}" コメントアウト!!
end
end
後は、コントローラからビューへのデータの受け渡し方さえわかれば、画面にデータを表示できそうな気がしてくる。
みてみると、コントローラのフィールド(@つきの変数ね)は、自動でView側から使えるという手はずになってるという。
ちょっと試しにやってみた。
コントローラの@nameに田中 太郎を代入して…
class EmployeesController < ApplicationController
def index
# とりあえず
@name = "田中 太郎"
end
end
Viewでそれを使ってみる。
<h1>Employees#index</h1>
<p>Find me in app/views/employees/index.html.erb</p>
<p><%= @name %> </p>
これで実行すると、ちゃんと田中 太郎が出てる!!
ということで、簡単に表形式で従業員一覧を出してみた。
コントローラでは、全従業員のデータを取得して@employeesという変数につっこんでるだけ。
class EmployeesController < ApplicationController
def index
# 全員を従業員番号でソートして取得
@employees = Employee.find(:all, :order => "emp_no asc")
end
end
Viewでは、それを使って表を組み立ててる。
<h1>従業員一覧</h1>
<table border="1">
<tr>
<th>従業員番号</th>
<th>従業員名</th>
<th>入社年月日</th>
</tr>
<% @employees.each do |employee| %>
<tr>
<td><%= employee.emp_no %> </td>
<td><%= employee.name %> </td>
<td><%= employee.ent_date %> </td>
</tr>
<% end %>
</table>
これを実行すると、下のように表示される。
タイトルが若干削れてるけど、それ以外はうまいこといってる。タイトルが削れてるのは、たぶんデフォルトであたってるスタイルシートが何かしてるせいだと思うので、とりあえずスルーしておく。
ついでなので、DBに何件かデータをつっこんでから再表示させてみた。
うん。いい感じだ。
長くなったので、今回はここまで。次回は、テストの仕方とかについてみてみようかな。