railsでRESTを実現するための方法についてまとめ。
RESTとは
- Representational State Transferの略
- URI(名詞)とmethod(動詞)で振る舞いを決める
RESTにするメリット
- 変わりにくいURI「Cool URI」が実現でき、ユーザビリティがあがる
- インタフェース構築手法が統一されるため、作るのが楽になる
ここからが本題。RAILS_ROOT/config/routes.rb内に下記のような文を追記する
map.resources :articles
そうすると、下記のようなRESTなルーティングが自動的に生成される。*1らくちん。
メソッド |
URLのパス |
アクション |
ヘルパー "index")と同じ。">*2 |
GET |
/articles |
index |
articles_url |
POST |
/articles |
create |
articles_url |
GET |
/articles/new |
new |
new_article_url |
GET |
/articles/1 |
show |
article_url(:id => 1) |
PUT |
/articles/1 |
update |
article_url(:id => 1) |
GET |
/articles/1/edit |
edit |
edit_article_url(:id => 1) |
DELETE |
/articles/1 |
destroy |
article_url(:id => 1) |
単数系と複数形
controller名の単数形複数形、map.resourceの単数形複数形で振る舞いがいろいろ変わってくる。なのでcontrollerを作るときは単数系と複数形をきちんと意識した方がいいみたい。少なくともRESTを使うcontrollerの名前は複数形したほうがいい。もしかしたらcontrollerの名前は全部複数形に統一したほうがいいのかもしれない。*3
以下どのように変わるかのメモ。
map.resources :article
controller名を単数形にすると、indexアクションのヘルパーが変化する。controller名が全部単数形になる。他は同じ
メソッド |
URLのパス |
アクション |
ヘルパー |
GET |
/article |
index |
article_index_url |
POST |
/article |
create |
article_index_url |
GET |
/article/new |
new |
new_article_url |
GET |
/article/1 |
show |
article_url(:id => 1) |
PUT |
/article/1 |
update |
article_url(:id => 1) |
GET |
/article/1/edit |
edit |
edit_article_url(:id => 1) |
DELETE |
/article/1 |
destroy |
article_url(:id => 1) |
map.resource :article
resourcesの方を単数形にすると、idを取り扱わないアクションとしてルーティングが作られる。
メソッド |
URLのパス |
アクション |
ヘルパー |
POST |
/article |
create |
article_url |
GET |
/article/new |
new |
new_article_url |
GET |
/article/edit |
edit |
edit_article_url |
GET |
/article |
show |
article_url |
PUT |
/article |
update |
article_url |
DELETE |
/article |
destroy |
article_url |
この時、パスは単数形(article)でもルーティング先のcontrollerの名前は複数形(articles)になる*4。
map.resoucesの拡張
map.resoucesでルーティング定義したcontrollerに、newとかupdateとかデフォルトで定義された以外のアクションのルーティングを定義する場合。
/article/1/recentのように、各IDごとに作用するアクションのルーティングを定義する場合
map.resources :articles, :member => { :release => :put }
/article/releaseみたいな場合
map.resources :articles, :collection => { :recent => :get }
/articles/new/shortformのように、既存のアクションnewアクションに上乗せしたルーティングを定義する場合
map.resources :articles, :new => { :shortform => :post }
修正
- 2008/06/12
- memberとcollectionが逆なのを修正、newオプションの説明を修正
map.resouces以外でRESTしたい場合
map.resourcesを使わないでRESTを実現したい(editとかupdateとかのアクション名が嫌いとか)
人は以下のようにしてひとつづつルートを設定する必要がある。面倒。
map.connect 'articles/:id',
:conditions => { :method => :put },
:action => 'updatedayo'
参考資料
WEB+DB PRESS Vol.38
- 作者: 出羽健一,佐々木一,田中ばびえ,宮川達彦,角征典,小飼弾,角田直行,たつを,関将俊,羽生章洋,和田省二,相馬純平,ひろせまさあき,笠原正寿,石丸清基,山本陽平,西岡祐弥,奥田佳子,吉永浩和,繁田卓二,桐山俊也,伊藤直也,尾島良司,猪股健太郎,高林哲,児玉サヌール,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2007/04/24
- メディア: 大型本
- 購入: 1人 クリック: 13回
- この商品を含むブログ (36件) を見る