第3回: コントローラとビューの生成(1)

2010/04/28

前回に引き続き、簡単なタスク管理ツール nchak を Rails 3.0 で作っていきます。

コントローラの生成

タスクを管理するツールですから、tasks というデータベーステーブル、それを扱う Task というモデル、そして tasks コントローラを作ることになりますね。

これらを一挙に生成してくれる scaffold というツールもありますが、現実の開発現場で使っている人はあまりいないと思います。別々に作っていきましょう。

さて、どこから作り始めましょうか。

かつてはデータベーススキーマをきっちりと作ってから、コントローラとビューの実装に着手するという順番が普通でしたが、近年は逆順(コントローラ・ビューの後でモデル)で実装するのがトレンドです。

データ構造を決める前にユーザーインターフェースを実装すべしという考え方は Outside-In と呼ばれ、「ビヘイビア駆動開発」の大原則の1つです。外側(ユーザーインターフェース)から先に作った方が「要求仕様」に沿った自然な設計を持つアプリケーションに仕上がりやすい、と考えられています。本当の意味で Outside-In を実践するためには、テストコードを書きながらアプリケーションを開発することが前提になります。しかし、それは初心者にとって相当に高いハードルなので、この連載では触れないことにします。また、別の機会に…

index アクションを持つ tasks コントローラを生成するには、ターミナルで次のコマンドを実行します。

rails generate controller tasks index

このコマンドは、副作用として index アクションに対応するビューを生成します。

index アクションには、タスクの一覧を表示する機能を実装していくことにしましょう。

リソースの登録

次に tasks コントローラに対応するリソースを登録します。

Rails における「リソース」という言葉の厳密な意味は知らなくても結構です。とりあえずは、簡潔な URL でアクションを呼び出すのに必要な設定であると考えてください。

エディタで config/routes.rb を開いてください。

先ほどのコマンドを実行した直後は、次のようになっています(コメント行は除去してあります)。

Nchak::Application.routes.draw do
  get "tasks/index"
end

get "tasks/index"http://localhost:3000/tasks/index という URL に対して GET メソッドでアクセスが来たら、tasks コントローラの index アクションを実行せよ、という意味です。

これを次のように修正します。

Nchak::Application.routes.draw do
  resources :tasks, :only => [ :index ]
end

かつて routes.rb は、ActionController::Routing::Routes.draw do |map| という記述で始まっていました。すなわち、Rails 2.3 までは、ブロック変数 map に対して resources メソッドを呼び出していましたが、Rails 3.0 ではこのように関数形式で呼び出せるようになりました。(加筆訂正 2010-10-11)

この結果、http://localhost:3000/tasks という URL で tasks コントローラの index アクションを呼び出すことが可能になります。URL に /index が付いている方が直感的には分かりやすいかもしれませんが、Rails コミュニティでは /index なしの URL が好まれます。

ブラウザで http://localhost:3000/tasks を開くと、次のような画面が表示されます。

画面キャプチャ1

HTML テンプレートの修正

次に index アクションに対応するビュー(HTML テンプレート)を修正しましょう。

エディタで app/views/tasks/index.html.erb を開くと、こう書かれています。

<h1>Tasks#index</h1>
<p>Find me in app/views/tasks/index.html.erb</p>

これを、次のように修正してください。

<h1>タスクの一覧</h1>

ブラウザを読み込み直すと、次のような画面になります。

画面キャプチャ2