プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

「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メソッドは返ってこないようですが、どうやって取得するのだろうか。。