Railsを使っている人からよく聞く話が、
config/routes.rb 書くのがめんどくさい・よくわからない
ということです。とくにSinatraのスタイルと比べると、Railsのルーティング定義は面倒なものに思えます。
基本的にはresources推奨なので、resourcesを書くだけではあるのですが、考えてみればRailsはConvention over Configuration (CoC) を標榜しているのに、推奨のルーティング設定も書かなきゃいけないというのはちょっと変な気もします。*1
だったら、コントローラ置いとけばresourcesとみなして勝手にルーティングしてくれるようにすればいいのでは、と思ってConventional Routesというgemを作ってみました。
Conventional Routes
これは何?
config/routes.rb に何も書かなくても、コントローラから自動的にルーティングを生成します。
すべてのルーティングはresourcesです。コントローラがサブディレクトリにある場合はnamespaceとみなします。
例
app/controllers/admin/special/licenses_controller.rb app/controllers/admin/users_controller.rb app/controllers/users_controller.rb
このコントローラがある場合は、このようなルーティング定義と同様になります。
namespace :admin do namespace :special do resources :licenses end resources :users end resources :users
生成されるルーティングはこのようになります。
admin_special_licenses GET /admin/special/licenses(.:format) admin/special/licenses#index
POST /admin/special/licenses(.:format) admin/special/licenses#create
new_admin_special_license GET /admin/special/licenses/new(.:format) admin/special/licenses#new
edit_admin_special_license GET /admin/special/licenses/:id/edit(.:format) admin/special/licenses#edit
admin_special_license GET /admin/special/licenses/:id(.:format) admin/special/licenses#show
PUT /admin/special/licenses/:id(.:format) admin/special/licenses#update
DELETE /admin/special/licenses/:id(.:format) admin/special/licenses#destroy
admin_users GET /admin/users(.:format) admin/users#index
POST /admin/users(.:format) admin/users#create
new_admin_user GET /admin/users/new(.:format) admin/users#new
edit_admin_user GET /admin/users/:id/edit(.:format) admin/users#edit
admin_user GET /admin/users/:id(.:format) admin/users#show
PUT /admin/users/:id(.:format) admin/users#update
DELETE /admin/users/:id(.:format) admin/users#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
このルーティングは、config/routes.rbに記述したルーティングよりも後ろに追加されます。
これ必要?
実際、こんなのは少し複雑なルーティングが必要になったらすぐ破綻してしまうので、半分ぐらいジョークgemなわけですが、一応必要な部分だけ自分で書けばいいのでそんなに困りません。
また、今はコントローラのファイルの存在しか見ていませんが、中も見るようにすれば、Sinatra的なやり方も実現できそうです。
scaffoldを使うと自動的にroutes.rbにも追記されますが、それよりはデフォルトがこのしくみのほうがいいのではと思いますがどうでしょうか?
きっかけ
江島さんのツイート。