Rails2.0でrouteを追加する方法

rails1.xの頃は、controllerへアクションを追加すると"/:controller/:action/:id"でアクセスできてたけど、2.0ではルーティング周りが変更されている。2.0ではconfig/routes.rbへ以下のように記述することでRESTfulなルーティングとヘルパーが追加される。

・config/routes.rb

map.resources :products

追加されるルーティング:("rake routes"で確認できる)

$ rake routes
              products GET     /products                          {:controller=>"products", :action=>"index"}
    formatted_products GET     /products.:format                  {:controller=>"products", :action=>"index"}
                       POST    /products                          {:controller=>"products", :action=>"create"}
                       POST    /products.:format                  {:controller=>"products", :action=>"create"}
           new_product GET     /products/new                      {:controller=>"products", :action=>"new"}
 formatted_new_product GET     /products/new.:format              {:controller=>"products", :action=>"new"}
          edit_product GET     /products/:id/edit                 {:controller=>"products", :action=>"edit"}
formatted_edit_product GET     /products/:id/edit.:format         {:controller=>"products", :action=>"edit"}
               product GET     /products/:id                      {:controller=>"products", :action=>"show"}
     formatted_product GET     /products/:id.:format              {:controller=>"products", :action=>"show"}
                       PUT     /products/:id                      {:controller=>"products", :action=>"update"}
                       PUT     /products/:id.:format              {:controller=>"products", :action=>"update"}
                       DELETE  /products/:id                      {:controller=>"products", :action=>"destroy"}
                      DELETE  /products/:id.:format              {:controller=>"products", :action=>"destroy"}
                               /:controller/:action/:id
                               /:controller/:action/:id.:format

追加されるヘルパー:(詳細はAPI参照)

Named Route   Helpers
============  =====================================================
products      products_url, hash_for_products_url,
              products_path, hash_for_products_path

product       product_url(id), hash_for_product_url(id),
              product_path(id), hash_for_product_path(id)

new_product   new_product_url, hash_for_new_product_url,
              new_product_path, hash_for_new_product_path

edit_product  edit_product_url(id), hash_for_edit_product_url(id),
              edit_product_path(id), hash_for_edit_product_path(id)

このヘルパーを使えば今まで

redirect_to :controller => 'products', :action => 'index'

のように書いていたものが

redirect_to products_url

のように書くことが出来る。


で、これで例えばproductsコントローラに"search"というアクションを追加して、今までどおりに"/products/search" とアクセスすると

ActiveRecord::RecordNotFound in ProductsController#show 
Couldn't find Product with ID=search

って具合に怒られる。showアクションにsearchというIDを渡してしまう。


"/products/search"へアクセスする為には、"config/routes.rb"へ以下のように記述する。(GETの場合)

map.resources :products, :collection => { :search => :get }

これによって以下のルーティングとヘルパーが追加され、"/products/search"へアクセス可能になる。
ルーティング:

$ rake routes
          search_products GET    /products/search                   {:controller=>"products", :action=>"search"}
formatted_search_products GET    /products/search.:format           {:controller=>"products", :action=>"search"}
--以下略--

ヘルパー:

Named Route        Helpers
===============    =====================================================
search_products    search_products_url, hash_for_search_products_url,
                   search_products_path, hash_for_search_products_path

※map.resourcesを削除すれば従来通りのルーティングも可能。