Rolling on Ruby on Rails - Japanese Translation - p3

by tanabe on June 18, 2005

Pages: 1, 2, 3, 4, 5

recipes テーブルを作成する

これから作るクックブックではレシピを作ることができる。そこで、レシピを保存するためのテーブルをデータベース上に作成してみよう。

MySQL-Frontの左ペインで、たった今作成したばかりのcookbookデータベースを右クリックする。そしてポップアップメニューからNew>Table... を選択。 (Figure 21)

creating a new table
Figure 21. テーブルの新規作成

テーブル名をrecipes にする。(Figure 22)

the Add Table dialog box
Figure 22. テーブル追加のダイアログボックス

重要!:MySQL-Frontは自動的にIdというプライマリキーを作成するが、Railsではid (すべて小文字)としておいた方がいい。詳細は後述するので、ここではとりあえず変更してほしい。左のペインで先ほど作ったrecipes テーブルを選択する。右のペインでId フィールドを右クリック、プロパティを選択する(Figure 23)、そして名称をidに変えよう。

renaming the primary key
Figure 23. プライマリキーの名称を変更する

レシピにフィールドを追加する

これでrecipesテーブルができた。レシピのデータを保存するフィールド(カラム)を追加していくことができる。まずはtitleinstructions フィールドを追加することから始めよう。後になればおそらくもっとたくさんのフィールドが必要だろう。でも、最初はこのくらいがちょうどいい。

recipeテーブルが選択された状態で、右のペインの何もないところで右クリックをし、New>Field... を選択しよう。(Figure 24)

adding a new field
Figure 24. 新しいフィールドを追加する

どのレシピにも必ずタイトルがあるものなので、レシピのタイトルのためのフィールドをvarchar(255) 、NOT NULL制約を付加で作成しよう。Figure 25がポップアップウィンドウに出てくるオプションだ。

adding the title field
Figure 25. title フィールドを追加する

上記の手順を繰り返し、instructions フィールドをtextとして作成する。Figure 26を参照。

adding the instructions field
Figure 26. instructions フィールドを追加する

これでrecipe テーブルはFigure 27のようになっているはずだ。

the modified recipe table
Figure 27. 作成されたrecipe テーブル

すごいことが始まる

ここまでにやってきたことは全部すぐにできるし、別に難しくもなかった。ただ、それほど面白いこともなかったと思う。けれど、それがここから一変する。あっという間にぼくたちは、ほんの最初のクックブックアプリケーションを立ち上げ、動かすことができる。

Modelを作る

まず、データベースのrecipes テーブルのデータを扱うRecipe modelクラスを作る。Figure 28のようなかんじだ。

the Recipe model class
Figure 28. Recipe model クラス

コマンドプロンプトを開きcookbookのフォルダ(c:\rails\cookbook)へ行って、コマンドを実行しよう。

ruby script\generate model Recipe

このコマンドがRecipe クラスの原型となる定義を含むファイル、recipe.rb を作成する。中を見るためにファイルを右クリックして編集(Edit)を選ぼう。(Figure 29)

the contents of recipe.rb
Figure 29. recipe.rbの内容

この一見からっぽのクラス定義はレシピのビジネスオブジェクトだ。これはRailsをデータベースのrecipesテーブルへとマッピングしている。この意味はすぐにもっとはっきりとわかるだろう。

さて、Railsの名前付けルールによって起こるちょっとしたプログラムのマジックをお見せしよう。単数形のモデルクラス(Recipe)は複数形のデータベーステーブル(recipes)へとマッピングされる。Railsは英語の複数形のルールをよく知っているので、Companycompaniesへと、Personpeopleへとマッピングされる。その他の単語についても同様に適切にマッピングされる。

さらに、RailsはRecipe クラスとrecipes テーブルの各行や各列のアトリビュートへアクセスするためのメソッドを動的に配置する。

つまりあなたは、このRecipe クラスとrecipes テーブルが動的に関連付けられるとんでもない様子を目の当たりにすることになる。

これであともう少しで、何かが起こる。あとは、レシピのcontroller (Figure 30)を作る必要がある。これは、標準的なCRUD(Create, Read, Update, Delete)を使ってデータベースのrecipesテーブルを操作するものだ。Railsではこれをあなたが考えているよりも簡単に実現できる。

the Recipe controller in its native environment
Figure 30. 標準の状態でのRecipe controller

コマンドプロンプトでcookbookフォルダ(c:\rails\cookbook)を開いて、コマンドを実行しよう。

ruby script\generate controller Recipe

これで、RecipeController クラスの骨組みを含んだrecipe_controller.rb というファイルが作成される。ファイルを右クリックして、編集(Edit)を選択し、Figure 31のようにscaffold :recipe という行を追加しよう。

one line of code in RecipeController
Figure 31. RecipeController のコード

このたった1行のコードがデータベースを現実の世界へ運んでくる。これだけですべてのCRUDを定義していて、すぐにcreate, read, update, deleteの各処理をデータベースのrecipesテーブルに使うことができるんだ。

ブラウザを開いて、http://127.0.0.1:3000/recipe/new を表示させよう。Figure 32のように表示されるはずだ。

creating a new recipe page
Figure 30. 新しいrecipe pageを作成する

ほら、すごいだろう?まだ何もたいしたことはしていない。なのにもうデータベースを扱うことができるんだ。でも、まだちょっと待ってほしい。先にrecipe テーブルにいくつかのフィールドを追加しよう。

MySQL-Frontを使ってdescription フィールドとdate フィールドをtitleフィールドとinstructionsフィールドの間に追加しよう。(Figures 33 と 34)

adding the description field
Figure 33. description フィールドを追加する

adding the date field
Figure 34. date フィールドを追加する

ブラウザを更新すると、Figure 35のようなページが現れる。

a new recipe page with the new fields
Figure 35. 新しいフィールドを持った新しいレシピページ

こりゃ、もうすごいなんてもんじゃない。とんでもない。

ちょっと落ち着いて、ためしにレシピを入力してみよう。各フィールドをFigure 36のように埋めたら、Createボタンをクリックする。

a new recipe
Figure 36. 新しいレシピ

Figure 37のようになるはずだ。

a listing of all recipes
Figure 37. 全レシピのリスト

もう一つ追加してみよう。"New recipe"リンクをクリックして、Figure 38のように入力しよう。

another new recipe
Figure 38. もう一つの新しいレシピ

Createを押すと、Figure 39のようになるはずだ。

a fuller list of all recipes
Figure 39. すべてのレシピが表示されたリスト

ほんの少しデータベースへ手を入れて、ソースコードを一行書いただけで、驚くほどの機能を手に入れてしまった。まだ見た目はあまりよくないけれど、それもすぐに良いものに直そう。

それまでの間、レシピを追加したり、削除したり、編集したりしてみてほしい。さあ、どうぞ。

ぼくは次のセクションで待っていよう。

Pages: 1, 2, 3, 4, 5



この記事へのトラックバック
Rolling with Ruby on Rails MySQL環境での開発サン...
Panther で Ruby on Rails (3)【花染人和クリエイション::MACなDTPと開発::トラブル記録】at October 17, 2006 23:20
Rolling with Ruby on Rails MySQL環境での開発サン...
Panther で Ruby on Rails (3)【花染人和クリエイション::MACなDTPと開発::トラブル記録】at October 17, 2006 23:22
Rolling with Ruby on Rails MySQL環境での開発サン...
Panther で Ruby on Rails (3)【花染人和クリエイション::MACなDTPと開発::トラブル記録】at October 17, 2006 23:39