「RailsによるアジャイルWebアプリケーション開発」20章読み中
この章はActionControllerのお話し。
ルーティング
ルーティングは、URIとHTTPメソッドの組み合わせに対し、どのコントローラとアクションが使われるかを決めるもの。
ActionController::Routing::Routesのroutesメソッドを使うと、ルーティング一覧を表示でき、また、recognize_pathメソッドを使うと、ルーティングのテストができます。
taka@taka-desktop:~/test$ ruby script/console Loading development environment (Rails 2.1.0) ** ActionController::Routing::Routesオブジェクトを変数rsに代入 >> rs = ActionController::Routing::Routes => #<ActionController::Routing::RouteSet:0xb73e70a8 @routes_last_modified=Sat Jul 12 20:30:42 +0900 2008, ... 以下略 ** ルーティング一覧を表示 >> puts rs.routes GET /products/ {:controller=>"products", :action=>"index"} GET /products.:format/ {:controller=>"products", :action=>"index"} POST /products/ {:controller=>"products", :action=>"create"} POST /products.:format/ {:controller=>"products", :action=>"create"} GET /products/new/ {:controller=>"products", :action=>"new"} GET /products/new.:format/ {:controller=>"products", :action=>"new"} GET /products/:id/edit/ {:controller=>"products", :action=>"edit"} GET /products/:id/edit.:format/ {:controller=>"products", :action=>"edit"} GET /products/:id/ {:controller=>"products", :action=>"show"} 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"} ANY /:controller/:action/:id/ {} ANY /:controller/:action/:id.:format/ {} => nil ** いくつかのURIをコントローラとアクションに変換してみる。 >> rs.recognize_path "/products" => {:controller=>"products", :action=>"index"} >> rs.recognize_path "/products/edit/1" => {:controller=>"products", :action=>"edit", :id=>"1"} >> ** HTTPメソッドも指定できる >> rs.recognize_path "/products", {:method => :post} => {:controller=>"products", :action=>"create"} >> rs.recognize_path "/products/1", {:method => :put} => {:controller=>"products", :action=>"update", :id=>"1"} >> rs.recognize_path "/products/1", {:method => :delete} => {:controller=>"products", :action=>"destroy", :id=>"1"}
generateメソッドを使って、逆の変換もできます。
>> rs.generate :controller=>"products", :action=>"destroy", :id=>"1" => "/products/1" >> rs.generate :controller=>"products", :action=>"update", :id=>"1" => "/products/1" >> rs.generate :controller=>"products", :action=>"index" => "/products" >>
HTTPメソッドは返ってこないようですが、どうやって取得するのだろうか。。