Rails3 で routes.rb を分割・追加する

故あって routes.rb を routes/frontend.rb と routes/backend.rb に分割したいとする。

とりあえず、 routes.rb の中で require なり load なりしてもよいが、これだと開発中に routes/frontend.rb を編集しても、再起動しない限り反映されない。

SampleApp::Application.routes.draw do
 # :
 # :
end

require_relative 'routes/frontend.rb'
require_relative 'routes/backend.rb'

そうしないためには、該当のファイルを routes ファイルパス設定に追加する。

config/application.rb の中で以下のように記述する。

module SampleApp
  class Application < Rails::Application
    # :
    # : その他の設定
    # :
    
    config.paths.config.routes.concat Dir[Rails.root.join("config/routes/*.rb")]
  end
end

あるいは追加したいパスが一つならば、 config.paths.config.routes << Rails.root.join("config/routes/aroute.rb") としてもよいようだ。
(config.paths.config.routes は Rails::Paths::Path なのでそのメソッドを参照。)

そして各ファイルに普通に routes.rb のようにルーティングを記述すればよい。

読み込まれる順番に注意。追加する際と 逆順で読み込まれる 。すなわち、先の例であれば以下のような順で load されることになる。

  1. config/routes/frontend.rb
  2. config/routes/backend.rb
  3. config/routes.rb