recipes
テーブルを作成する
これから作るクックブックではレシピを作ることができる。そこで、レシピを保存するためのテーブルをデータベース上に作成してみよう。
MySQL-Frontの左ペインで、たった今作成したばかりのcookbookデータベースを右クリックする。そしてポップアップメニューからNew>Table...
を選択。 (Figure 21)
Figure 21. テーブルの新規作成
テーブル名をrecipes
にする。(Figure 22)
Figure 22. テーブル追加のダイアログボックス
重要!:MySQL-Frontは自動的にId
というプライマリキーを作成するが、Railsではid
(すべて小文字)としておいた方がいい。詳細は後述するので、ここではとりあえず変更してほしい。左のペインで先ほど作ったrecipes
テーブルを選択する。右のペインでId
フィールドを右クリック、プロパティを選択する(Figure 23)、そして名称をid
に変えよう。
Figure 23. プライマリキーの名称を変更する
レシピにフィールドを追加する
これでrecipesテーブルができた。レシピのデータを保存するフィールド(カラム)を追加していくことができる。まずはtitle
とinstructions
フィールドを追加することから始めよう。後になればおそらくもっとたくさんのフィールドが必要だろう。でも、最初はこのくらいがちょうどいい。
recipeテーブルが選択された状態で、右のペインの何もないところで右クリックをし、New>Field...
を選択しよう。(Figure
24)
Figure 24. 新しいフィールドを追加する
どのレシピにも必ずタイトルがあるものなので、レシピのタイトルのためのフィールドをvarchar(255)
、NOT NULL制約を付加で作成しよう。Figure
25がポップアップウィンドウに出てくるオプションだ。
Figure 25. title
フィールドを追加する
上記の手順を繰り返し、instructions
フィールドをtext
として作成する。Figure
26を参照。
Figure 26. instructions
フィールドを追加する
これでrecipe テーブルはFigure 27のようになっているはずだ。
Figure 27. 作成されたrecipe
テーブル
すごいことが始まる
ここまでにやってきたことは全部すぐにできるし、別に難しくもなかった。ただ、それほど面白いこともなかったと思う。けれど、それがここから一変する。あっという間にぼくたちは、ほんの最初のクックブックアプリケーションを立ち上げ、動かすことができる。
Modelを作る
まず、データベースのrecipes
テーブルのデータを扱うRecipe
modelクラスを作る。Figure
28のようなかんじだ。
Figure 28. Recipe
model クラス
コマンドプロンプトを開きcookbookのフォルダ(c:\rails\cookbook)へ行って、コマンドを実行しよう。
ruby script\generate model Recipe
このコマンドがRecipe
クラスの原型となる定義を含むファイル、recipe.rb を作成する。中を見るためにファイルを右クリックして編集(Edit)を選ぼう。(Figure
29)
Figure 29. recipe.rbの内容
この一見からっぽのクラス定義はレシピのビジネスオブジェクトだ。これはRailsをデータベースのrecipes
テーブルへとマッピングしている。この意味はすぐにもっとはっきりとわかるだろう。
さて、Railsの名前付けルールによって起こるちょっとしたプログラムのマジックをお見せしよう。単数形のモデルクラス(Recipe
)は複数形のデータベーステーブル(recipes
)へとマッピングされる。Railsは英語の複数形のルールをよく知っているので、Company
はcompanies
へと、Person
はpeople
へとマッピングされる。その他の単語についても同様に適切にマッピングされる。
さらに、RailsはRecipe
クラスとrecipes
テーブルの各行や各列のアトリビュートへアクセスするためのメソッドを動的に配置する。
つまりあなたは、このRecipe
クラスとrecipes
テーブルが動的に関連付けられるとんでもない様子を目の当たりにすることになる。
これであともう少しで、何かが起こる。あとは、レシピのcontroller (Figure 30)を作る必要がある。これは、標準的なCRUD(Create, Read, Update, Delete)を使ってデータベースのrecipesテーブルを操作するものだ。Railsではこれをあなたが考えているよりも簡単に実現できる。
Figure 30. 標準の状態でのRecipe controller
コマンドプロンプトでcookbookフォルダ(c:\rails\cookbook)を開いて、コマンドを実行しよう。
ruby script\generate controller Recipe
これで、RecipeController
クラスの骨組みを含んだrecipe_controller.rb
というファイルが作成される。ファイルを右クリックして、編集(Edit)を選択し、Figure 31のようにscaffold :recipe
という行を追加しよう。
Figure 31. RecipeController
のコード
このたった1行のコードがデータベースを現実の世界へ運んでくる。これだけですべてのCRUDを定義していて、すぐにcreate, read, update, deleteの各処理をデータベースのrecipesテーブルに使うことができるんだ。
ブラウザを開いて、http://127.0.0.1:3000/recipe/new
を表示させよう。Figure 32のように表示されるはずだ。
Figure 30. 新しいrecipe pageを作成する
ほら、すごいだろう?まだ何もたいしたことはしていない。なのにもうデータベースを扱うことができるんだ。でも、まだちょっと待ってほしい。先にrecipe
テーブルにいくつかのフィールドを追加しよう。
MySQL-Frontを使ってdescription
フィールドとdate
フィールドをtitle
フィールドとinstructions
フィールドの間に追加しよう。(Figures
33 と 34)
Figure 33. description
フィールドを追加する
Figure 34. date
フィールドを追加する
ブラウザを更新すると、Figure 35のようなページが現れる。
Figure 35. 新しいフィールドを持った新しいレシピページ
こりゃ、もうすごいなんてもんじゃない。とんでもない。
ちょっと落ち着いて、ためしにレシピを入力してみよう。各フィールドをFigure 36のように埋めたら、Createボタンをクリックする。
Figure 36. 新しいレシピ
Figure 37のようになるはずだ。
Figure 37. 全レシピのリスト
もう一つ追加してみよう。"New recipe"リンクをクリックして、Figure 38のように入力しよう。
Figure 38. もう一つの新しいレシピ
Createを押すと、Figure 39のようになるはずだ。
Figure 39. すべてのレシピが表示されたリスト
ほんの少しデータベースへ手を入れて、ソースコードを一行書いただけで、驚くほどの機能を手に入れてしまった。まだ見た目はあまりよくないけれど、それもすぐに良いものに直そう。
それまでの間、レシピを追加したり、削除したり、編集したりしてみてほしい。さあ、どうぞ。
ぼくは次のセクションで待っていよう。