Hatena::ブログ(Diary)

ぶろぐ。@はてな Twitter

Web関係の技術記事中心のblog

2012-04-07 (Sat)

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にも追記されますが、それよりはデフォルトがこのしくみのほうがいいのではと思いますがどうでしょうか?

きっかけ

江島さんのツイート

*1:昔はデフォルト設定が最後の行に書かれていたのですが、非推奨なので今はコメントアウトされています。これはactionがパスに含まれているので使うべきではありません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/tkawa/20120407/p1