routes.rb が必要なくなる Rails gem
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にも追記されますが、それよりはデフォルトがこのしくみのほうがいいのではと思いますがどうでしょうか?
きっかけ
江島さんのツイート。