Rails2.0の足回りと中級者への道
第3回 Rails2.0で作るRESTfulアプリケーション(後編)
前回の記事では,Rails2.0のscaffoldをベースに,RESTfulなdel.icio.usクローンのブックマークアプリケーションを作成してみました。今回は前回作成したアプリケーションをRails2.0の機能を用いて改良していきたいと思います。
リソース設計
前回作成したブックマークアプリケーションは,RESTの統一インターフェースにもとづいた,以下のリソースを持ちます。
| 機能 | HTTP Method | URI |
|---|---|---|
| リンクの作成 | POST | /links |
| リンクの表示 | GET | /links/:id |
| リンクの変更 | PUT | /links/:id |
| リンクの削除 | DELETE | /links/:id |
つまり,現在のminiciousはログインした本人のリンクのCRUDが可能な,それしかできないアプリケーションです。
ソーシャルブックマークと名乗っているにもかかわらず,一人の世界だけで完結しているのはあまりに寂しいものです。他のユーザのリンクも閲覧可能にしましょう。ただし,自分以外のユーザのリンクを編集できるのは問題ですから,作成,変更,削除が可能なのは自分のリンクだけとします。
これらを踏まえて,提供するリソースを拡張してみます。
| 機能 | HTTP Method | URI |
|---|---|---|
| リンクの作成 | POST | /:username/links |
| リンク一覧表示 | GET | /:username/links |
| リンクの表示 | GET | /:username/links/:id |
| リンクの変更 | PUT | /:username/links/:id |
| リンクの削除 | DELETE | /:username/links/:id |
| タグ一覧表示 | GET | /:username/tags |
| タグの表示 | GET | /:username/tags/:id |
Routing map.resourceふたたび
前説で設計したリソースに対する,RailsのRouting設定はどうなるでしょうか?
具体的なコードに入る前に,RailsのRESTful Routingを作成する,map.resources, map.resouceの機能について再度まとめておきます。
特に,map.resouces,map.resouceでRESTfulなCRUDが作成されることはこれまで何度が見てきました。ここでは,これらのメソッドが持つオプションについて見ていきましょう。
:path_prefix
リソースがネストする場合に,リソースの前に付くパスを指定します。前節のリソース設計で,リンクリソース,タグリソースの前に,ユーザ名のパスを前置するよう修正しました。そういった場合のresoucesは以下のようになります。
map.resouces :links, :path_prefix => ':username'
ここで指定した,path_prefixはコントローラやビュー内でパラメータとして取得できます。
:has_many, :has_one
Routingのネストを行い,従属リソースを表現します。:has_manyオプションは複数のリソースを表現し,:has_oneは単一のリソースを表現します。
今回作成しているブックマークアプリケーションでは「ユーザ」をリソースとして提供していませんが,「ユーザ」のCRUDをRESTful Webサービスで行うアプリケーションも考えられます。そういった場合のRouting定義は以下のようになります。
:has_manyオプション
map.resources :users, :has_many => [:links, :tags]
ユーザリソースに,リンクとタグを従属させています。この場合のリソースは以下のように表現されます。
リソース抜粋
| 機能 | HTTP Method | URI |
|---|---|---|
| リンクの作成 | POST | /users/:id/links |
| リンクの表示 | GET | /users/:id/links/:id |
| タグの表示 | GET | /users/:id/tags/:id |
例:リンクの表示
GET /users/1/links/6.xml
:member
CRUD以外,すなわち作成,参照,更新,削除以外の処理を行いたい場合,map.resoucesで,:memberオプションを指定します。:memberオプションには,アクション名とHTTP MethodのHashを指定します。
例として,リンクを非表示に設定するケースを考えます。リンクの非表示を,hideカスタムアクションへのPUT Methodで表現すると決定した場合,以下のように設定します。
:memberオプション
map.resouces :link, :member => {:hide => :put}
URI例
PUT /links/1/hide
なお,このURIにはhideという「動詞」が入っているため,RESTの統一インターフェースの原則的にはあまり望ましくありません。
miniciousのRouting定義
これらの機能を用いた,前節のリソース設計に対するRouting定義は以下のようになります。
config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.home '', :controller => 'sessions', :action => 'destroy'
map.resources :links , :path_prefix => '/:username'
map.resources :tags , :path_prefix => '/:username'
map.resource :session
map.login 'login', :controller => 'sessions', :action => 'new'
map.logout 'logout', :controller => 'sessions', :action => 'destroy'
end
Rails2.0の足回りと中級者への道
- 第4回 Railsアプリケーションをもっと速く
- 第3回 Rails2.0で作るRESTfulアプリケーション(後編)
- 第2回 Rails2.0で作るRESTfulアプリケーション(前編)
- 第1回 Rails2.0の足回り


