ルーティングの追加

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にしたいがまだレコードがないため)

参考

  1. こちら(→2.0のmap.resourcesのオプション設定いろいろ - ザリガニが見ていた...。)が大変わかりやすくまとまっていて助かります。