Ruby on Rails 3.0 日記
第9回: タスクの完了
前回は、タスクを追加するアクションを実装しました。
今回は、タスクを完了させる finish アクションを実装します。
ルーティングの修正
エディタで config/routes.rb を開いて、次のように修正してください。
Nchak::Application.routes.draw do
resources :tasks, :only => [ :index, :create ] do
put :finish, :on => :member
end
end
標準の 7 つのアクション(index, show, new, edit, create, update, destroy)以外のアクションを登録するには、do ... end ブロックの内側で get, post, put, delete メソッドを呼びます。これらのメソッドは HTTP メソッドの名前に対応しています。また、これらのメソッドの :on オプションには、アクションが特定の単一レコードを対象とする場合は :member、アクションがレコードの集合を対象とする場合は :collection を指定します。
この修正の結果、/tasks/123/finish という URL パスに対して PUT メソッドでリクエストすると、tasks コントローラの finish アクションが実行されるようになります。
なお、Rails 2.x では次のように記述していました。
ActionController::Routing::Routes.draw do |map|
map.resources :tasks, :only => [ :index, :create ], :member => { :finish => :put }
end
あまり変化していないように見えますが、非標準アクションの数が多くなってくると、Rails 3.0 の新しい書き方は大変便利です。
ActionController::Routing::Routes.draw do |map|
map.resources :tasks, :only => [ :index, :create ],
:member => { :finish => :put, :unfinish => :put },
:collection => { :done => :get }
end
と、こんな風に書くより、
Nchak::Application.routes.draw do
resources :tasks, :only => [ :index, :create ] do
put :finish, :on => :member
put :unfinish, :on => :member
get :done, :on => :collection
end
end
の方がすっきりしていますよね。
finish アクションの実装
app/controllers/tasks_controller.rb を次のように修正します。
class TasksController < ApplicationController
(省略)
def finish
@task = Task.find(params[:id])
@task.update_attribute(:done, true)
redirect_to :back
end
end
まず完了したいタスクを変数 @task に入れ、その done カラムの値を true にセットし、元のページにリダイレクトしています。
HTML テンプレートの修正
app/views/tasks/index.html.erb を次のように修正します。
(省略) <table class="tasks"> <col class="name" /> <col class="due_date" /> <col class="commands" /> <%= render @tasks %> </table>
app/views/tasks/_task.html.erb を次のように修正します。
<tr> <td><%= task.name %></td> <td><%= task.due_date %></td> <td><%= link_to '完了', [ :finish, task ], :method => :put %></td> </tr>
link_to はハイパーリンク(つまり、a タグ)を生成するメソッドですが、:method オプションを指定すると GET 以外の HTTP メソッドでブラウザにアクセスさせることができます。
この書き方は Rails 2.x から変化していませんが、生成される HTML コードの形は大きく変化しています。Rails 2.x では、やや長い JavaScript コードが HTML コードの中に埋め込まれていました。
しかし、Rails 3.0 では、次のように単なる a タグが生成されます。
<a href="/tasks/1/finish" data-method="put" rel="nofollow">完了</a>
この a タグがちゃんと「動く」のは、Rails 3.0 で導入された /public/javascripts/rails.js が存在するためです。JavaScript に詳しい方は、中身を覗いてみると面白いでしょう。
ブラウザで動作確認
タスク一覧ページを開き直します。

「Task 1」の「完了」リンクをクリックします。

done の値が true になったタスクは一覧から消えています。
(2010/05/15)
記事に関するご質問は、 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)

