ルーティングの追加
map.resouceで作成されたルーティングで概ねいいんだけど、少しだけ追加したいなということがあります。そういうときのやり方です。
アクションの追加
テーブル全体の一覧を表示する indexアクションとは別に listアクションを追加する場合、「myapp/config/routes.rb」を次のようにします。
ActionController::Routing::Routes.draw do |map| map.resources :items, :collection => [:list] end
これでルーティングの一番先頭に listが追加されます。
C:\www\2.5-55.jp> rake routes
(in C:/www/2.5-55.jp)
list_items /items/list {:controller=>"items", :action=>"list"}
formatted_list_items /items/list.:format {:controller=>"items", :action=>"list"}
items GET /items {:controller=>"items", :action=>"index"}
formatted_items GET /items.:format {:controller=>"items", :action=>"index"}
POST /items {:controller=>"items", :action=>"create"}
POST /items.:format {:controller=>"items", :action=>"create"}
new_item GET /items/new {:controller=>"items", :action=>"new"}
formatted_new_item GET /items/new.:format {:controller=>"items", :action=>"new"}
edit_item GET /items/:id/edit {:controller=>"items", :action=>"edit"}
formatted_edit_item GET /items/:id/edit.:format {:controller=>"items", :action=>"edit"}
item GET /items/:id {:controller=>"items", :action=>"show"}
formatted_item GET /items/:id.:format {:controller=>"items", :action=>"show"}
PUT /items/:id {:controller=>"items", :action=>"update"}
PUT /items/:id.:format {:controller=>"items", :action=>"update"}
DELETE /items/:id {:controller=>"items", :action=>"destroy"}
DELETE /items/:id.:format {:controller=>"items", :action=>"destroy"}
概ね意図通りだけど、HTTPのメソッド(GET、POST、PUT、DELETE)指定がないところが気になります。listはGETだけあればいいので、「myapp/config/routes.rb」をこういうふうに修正してみました。
ActionController::Routing::Routes.draw do |map| map.resources :items, :collection => [:list => :get] end
C:\www\2.5-55.jp> rake routes
(in C:/www/2.5-55.jp)
listget_items /items/listget {:controller=>"items", :action=>"listget"}
formatted_listget_items /items/listget.:format {:controller=>"items", :action=>"listget"}
items GET /items {:controller=>"items", :action=>"index"}
ブブー!。GETメソッド限定にしたいのに listgetになってしまっています。これは :collectionを配列[]で指定しているから。指定を HASHにしてみます。
ActionController::Routing::Routes.draw do |map| map.resources :items, :collection => { :list => :get } end
C:\www\2.5-55.jp> rake routes
(in C:/www/2.5-55.jp)
list_items GET /items/list {:controller=>"items", :action=>"list"}
formatted_list_items GET /items/list.:format {:controller=>"items", :action=>"list"}
items GET /items {:controller=>"items", :action=>"index"}
今度はうまくいきました。
ルーティングについての簡単なまとめ
- :collectionは、テーブル全体に対するアクションを指定。
- :memberは、一つのレコードに対するアクションを指定。
- :newは、作成中の入力フォームに対するアクションを指定(:memberにしたいがまだレコードがないため)
参考
- こちら(→2.0のmap.resourcesのオプション設定いろいろ - ザリガニが見ていた...。)が大変わかりやすくまとまっていて助かります。