STEP 8: 未完了タスクの一覧

2010/02/03

今回は、基本の7アクション以外のアクションを追加する方法を説明したいと思います。

/tasks ですべてのタスクの一覧が表示されますが、/tasks/unfinished で未完了タスクの一覧が表示されるようにしてみましょう。


まず、ルーティングを修正します。

$ edit config/routes.rb
ActionController::Routing::Routes.draw do |map|
  map.root :controller => 'top', :action => 'index'

  map.resources :tasks,
    :collection => { :unfinished => :get }
end

:collection オプションは、レコードの集合(collection)に作用するアクションを定義する時に使用します。

オプションの値は { :unfinished => :get } というハッシュです。ハッシュのキー(:unfinished)はアクション名、値(:get)はアクションを呼ぶ時に使用するHTTPメソッドを示しています。

Railsでは、GET/POST/PUT/DELETE という4つのHTTPメソッドを使い分けます。

HTTPメソッドについては、Wikipedia の Hypertext Transfer Protocol を参照してください。


続いて、Tasks コントローラに unfinished アクションを追加します。

$ edit app/controllers/tasks_controller.rb
class TasksController < ApplicationController
  def index
    @tasks = Task.all(:order => 'due_date')
  end

  def unfinished
    @tasks = Task.unfinished.all(:order => 'due_date')
    render :action => 'index'
  end

  (省略)
end

Task モデルに unfinished メソッドを定義します。

$ edit app/models/task.rb
class Task < ActiveRecord::Base
  named_scope :unfinished, :conditions => { :done => false }

  (省略)
end

named_scope メソッドは、レコードオブジェクトを「ある方法」で取得するクラスメソッドをモデルに追加してくれます。ここでは、done の値が false であるという条件を満たすレコードだけを取得する unfinished メソッドを定義しています。


次に、トップページのテンプレートを修正します。

$ edit app/views/top/index.html.erb
<h1>メニュー</h1>

<ul>
  <li><%= link_to 'タスク一覧(全部)', :tasks %></li>
  <li><%= link_to 'タスク一覧(未完了)', [ :unfinished, :tasks ] %></li>
</ul>

最後に、タスク一覧ページのテンプレートを修正します。

$ edit app/views/tasks/index.html.erb
<% if params[:action] == 'index' %>
<h1>タスク一覧(全部)</h1>
<% else %>
<h1>タスク一覧(未完了)</h1>
<% end %>

(省略)

ブラウザでトップページを表示します。

画面キャプチャ1

「タスク一覧(未完了)」リンクをクリックします。

画面キャプチャ2