Ruby on Rails 3.0 日記
第6回: タスクの一覧
前回は、タスクを記録するデータベース周りの土台を作りました。
今回は、実際にタスクの一覧を表形式で表示してみましょう。
index アクション
エディタで app/controllers/tasks_controller.rb を開いて、次のように修正してください。
class TasksController < ApplicationController
def index
@tasks = Task.all(:conditions => { :done => false }, :order => "due_date")
end
end
done カラムが false であるレコード群を due_date で昇順にソートして変数 @tasks にセットしています。
HTML テンプレート本体の修正
エディタで app/views/tasks/index.html.erb を開いて、次のように修正してください。
<h1>タスクの一覧</h1>
<table class="tasks">
<col class="name" />
<col class="due_date" />
<% @tasks.each do |task| %>
<%= render 'task', :task => task %>
<% end %>
</table>
配列 @tasks の各要素をブロック変数 task にセットして do から end までを繰り返します。ループの内部では部分テンプレート 'task' にローカル変数 task を渡しています。
Rails 2.x では(正確に言うと、Rails 2.2 までは)
<%= render :partial => 'task', :locals => { :task => task } %>
のように記述する必要がありました。簡単になりましたね。
[訂正] この記事を最初に発表した時は、render 'task', :locals => { :task => task } と書いてしまい、読者の方から「エラーになる」とご指摘いただきました。この書き方では task オブジェクトが部分テンプレートに渡りません。Rails 2.x での書き方は Rails 3.0 でも有効です(2010年5月11日)。
実は、もっと記述を簡潔にすることが可能です。
<% @tasks.each do |task| %>
<%= render 'task', :task => task %>
<% end %>
のように部分テンプレート名、ローカル変数名、オブジェクトのクラス名が一致する場合、
<%= render @tasks %>
と書くことができます。この書き方も Rails 2.3 で導入されました。
[訂正] 「実は」以降の文は、この記事の発表後に追加されました(2010年5月11日)。
部分テンプレートの作成
エディタで app/views/tasks/_task.html.erb を作成します。
<tr> <td><%= task.name %></td> <td><%= task.due_date %></td> </tr>
ローカル変数 task は、テンプレート本体から渡された Task オブジェクトです。その name と due_date カラムの値を埋め込んでいます。
Rails 2.3 までは、セキュリティの観点から <%= h(task.name) %> のように h メソッドでエスケープする必要がありました。task.name の値に、危険な JavaScript コードが埋め込まれているかもしれないからです。しかし、Rails 3.0 では、文字列をテンプレート中に埋め込む際にデフォルトでエスケープしてくれるので h メソッドは不要になりました。なお、エスケープしたくない場合は、<%= raw(task.name) %> のように raw メソッドを使用します。
スタイルシートの作成
新しいスタイルシート public/stylesheets/tasks.css を作成してください。
table.tasks {
width: 560px;
margin: 5px auto;
background-color: #eee;
border-collapse: collapse;
border-spacing: 0;
}
table.tasks tr {
border: solid 1px #ccc;
}
table.tasks td {
padding: 5px;
}
table.tasks col.name {
width: 400px;
}
table.tasks col.due_date {
background-color: #ddd;
}
レイアウト application.html.erb に stylesheet_link_tag :all という記述があるおかげで、public/stylesheets ディレクトリにある .css ファイルはすべてスタイルシートとして読み込まれます。
ブラウザで http://localhost:3000/tasks を開くと、次のような画面が現れます。

(2010/05/02)
記事に関するご質問は、 hermes@oiax.jp までメールでお送りください。
ウェブサイト構築の発注先を検討されているお客様は、ご相談フォームをご利用ください。
- はじめに
- 第1回: インストール (2010/04/24)
- 第2回: 新規アプリケーションの作成 (2010/04/25)
- 第3回: コントローラとビューの生成(1) (2010/04/28)
- 第4回: コントローラとビューの生成(2) (2010/04/29)
- 第5回: データベーステーブルとモデル (2010/05/01)
- 第6回: タスクの一覧 (2010/05/02)
- 第7回: タスクの新規追加フォーム (2010/05/09)
- 第8回: タスクの新規追加 (2010/05/09)
- 第9回: タスクの完了 (2010/05/15)
- 第10回: 完了したタスクの一覧 (2010/05/16)
- 第11回: Bundler (2010/05/17)
- 第12回: ユーザー認証(1) (2010/05/18)
- 第13回: ユーザー認証(2) (2010/05/19)
- 第14回: ユーザーとタスクの関連づけ (2010/05/29)
- 第15回: Devise によるユーザー認証機能の日本語化(1) (2010/10/09)
- 第16回: Devise によるユーザー認証機能の日本語化(2) (2010/10/15)
- 第17回: Devise によるユーザー認証機能の日本語化(3) (2010/10/16)

