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を削除すれば従来通りのルーティングも可能。