Ruby on Rails の勉強を始めたころ、なぜここは単数形で名前をつけるのか、なぜここは複数形にするのか、といったことでいちいち悩みました。最近、RESTful routing の勉強をしていて、controller の名前を単数にしてしまった場合の例が見つからず、「名前つけ直そうか」と焦ったのですが。。
以下、Rails 2.2.2 で確認しました。
config/routes.rb で
map.resources :channels
と書くと
$ rake routes
channels GET /channels {:controller=>"channels", :action=>"index"}
formatted_channels GET /channels.:format {:controller=>"channels", :action=>"index"}
POST /channels {:controller=>"channels", :action=>"create"}
POST /channels.:format {:controller=>"channels", :action=>"create"}
new_channel GET /channels/new {:controller=>"channels", :action=>"new"}
formatted_new_channel GET /channels/new.:format {:controller=>"channels", :action=>"new"}
edit_channel GET /channels/:id/edit {:controller=>"channels", :action=>"edit"}
formatted_edit_channel GET /channels/:id/edit.:format {:controller=>"channels", :action=>"edit"}
channel GET /channels/:id {:controller=>"channels", :action=>"show"}
formatted_channel GET /channels/:id.:format {:controller=>"channels", :action=>"show"}
PUT /channels/:id {:controller=>"channels", :action=>"update"}
PUT /channels/:id.:format {:controller=>"channels", :action=>"update"}
DELETE /channels/:id {:controller=>"channels", :action=>"destroy"}
DELETE /channels/:id.:format {:controller=>"channels", :action=>"destroy"}
となり、view で <%= link_to “index”, channels_path %> などと書けます。
たまたま controller を channel のように単数形にしてしまうとどうなるのか、試してみました。
map.resources :channel
$ rake routes
channel_index GET /channel {:controller=>"channel", :action=>"index"}
formatted_channel_index GET /channel.:format {:controller=>"channel", :action=>"index"}
POST /channel {:controller=>"channel", :action=>"create"}
POST /channel.:format {:controller=>"channel", :action=>"create"}
new_channel GET /channel/new {:controller=>"channel", :action=>"new"}
formatted_new_channel GET /channel/new.:format {:controller=>"channel", :action=>"new"}
edit_channel GET /channel/:id/edit {:controller=>"channel", :action=>"edit"}
formatted_edit_channel GET /channel/:id/edit.:format {:controller=>"channel", :action=>"edit"}
channel GET /channel/:id {:controller=>"channel", :action=>"show"}
formatted_channel GET /channel/:id.:format {:controller=>"channel", :action=>"show"}
PUT /channel/:id {:controller=>"channel", :action=>"update"}
PUT /channel/:id.:format {:controller=>"channel", :action=>"update"}
DELETE /channel/:id {:controller=>"channel", :action=>"destroy"}
DELETE /channel/:id.:format {:controller=>"channel", :action=>"destroy"}
のようになりました。
link_to ‘xxx’, channels_path が channel_index_path のようになり、多少名前が冗長にはなりますが、無事に RESTful routing に移行できそうです。
- 2009-07-22 追記:rails 2.x の scaffold が生成するのは「複数形の名前が付けられたコントローラ」なので、scaffold 流に揃えたほうがよさそうですね。