第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
を開くと、次のような画面が表示されます。
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>
ブラウザを読み込み直すと、次のような画面になります。