🐈

Rails6.1 で config/routes.rb を分割する

2021/06/06に公開

はじめに

Railsアプリケーションではconfig/routes.rbにルーティングを記述します。
ただ規模が大きくなればなるほど、1つのファイルで管理するのは難しくなります。

Rails6.1 のアップデートで、config/routes.rbから外部のルーティングを読み込むことが可能になりました。

厳密には復活のようですね。

Bring back the feature that allows loading external route files from the router.

This feature existed back in 2012 but got reverted with the incentive that
https://github.com/rails/routing_concerns was a better approach. Turned out
that this wasn't fully the case and loading external route files from the router
can be helpful for applications with a really large set of routes.
Without this feature, application needs to implement routes reloading
themselves and it's not straightforward.

引用:Rails6.1 CHANGELOG
参照PR:https://github.com/rails/rails/pull/37892

やってみる

実装は超かんたんです。
config/routes.rbconfig/routes/以下に配置したルーティングファイルをdraw(:hoge)で読み込みます。

config/routes.rb
Rails.application.routes.draw do
  root to: 'home#index'
  resources :users

  draw(:admin)
  draw(:api)
end
config/routes/admin.rb
namespace 'admin' do
  root to: "home#index"
end
config/routes/api.rb
namespace 'api' do
  resources :users
end

こうすると...

$ bin/rails routes
       Prefix Verb   URI Pattern                   Controller#Action
         root GET    /                             home#index
        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
              PATCH  /users/:id(.:format)          users#update
              PUT    /users/:id(.:format)          users#update
              DELETE /users/:id(.:format)          users#destroy
   admin_root GET    /admin(.:format)              admin/home#index
    api_users GET    /api/users(.:format)          api/users#index
              POST   /api/users(.:format)          api/users#create
 new_api_user GET    /api/users/new(.:format)      api/users#new
edit_api_user GET    /api/users/:id/edit(.:format) api/users#edit
     api_user GET    /api/users/:id(.:format)      api/users#show
              PATCH  /api/users/:id(.:format)      api/users#update
              PUT    /api/users/:id(.:format)      api/users#update
              DELETE /api/users/:id(.:format)      api/users#destroy

簡単にルーティングファイルの分割ができました。

  • 管理画面用のルーティング
  • API用のルーティング(バージョンごとも)
  • 機能ごと

などなど様々な観点で分割できるので、見通しの良いルーティングファイルにしていきましょう。

Discussion