railsでRESTを実現するための方法についてまとめ。
RESTとは
- Representational State Transferの略
- URI(名詞)とmethod(動詞)で振る舞いを決める
railsでRESTするには
ここからが本題。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'
参考資料
RailsによるアジャイルWebアプリケーション開発 第2版
- 作者: Dave Thomas,David Heinemeier Hansson,Leon Breedt,Mike Clark,Andreas Schwarz,James Duncan Davidson,Justin Gehtland,前田修吾
- 出版社/メーカー: オーム社
- 発売日: 2007/10/26
- メディア: 大型本
- 購入: 18人 クリック: 300回
- この商品を含むブログ (138件) を見る
- 作者: 出羽健一,佐々木一,田中ばびえ,宮川達彦,角征典,小飼弾,角田直行,たつを,関将俊,羽生章洋,和田省二,相馬純平,ひろせまさあき,笠原正寿,石丸清基,山本陽平,西岡祐弥,奥田佳子,吉永浩和,繁田卓二,桐山俊也,伊藤直也,尾島良司,猪股健太郎,高林哲,児玉サヌール,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2007/04/24
- メディア: 大型本
- 購入: 1人 クリック: 13回
- この商品を含むブログ (36件) を見る