やりたいこと
ルーティングの定義ファイル config/routes.rb を複数のファイルに分割したい。
具体的には lib/my_app/routes.rb というファイルを用意していて、それを読み込またい。
昔の解決策
2015年の記事 https://y-yagi.tumblr.com/post/118514473965/ がヒットするが、そのままだとうまく行かない。
draw の定義と実行までは上手くいくけど、リロードさせるあたりの仕組みが古くなっているらしくて失敗する。
rails 7 の解決策
ralis 7 では標準対応している。
rails 6 の解決策
Rails6 ではルーティングの読み込み方がかなり整理されていて自分でリロードさせたりする必要はなさそう。
https://qiita.com/ryohashimoto/items/7caf905389ccb5d7d8fb#configroutesrb%E3%81%A7%E5%A4%96%E9%83%A8%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80%E3%81%93%E3%81%A8%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB
Rails::Application::RoutesReloader というクラスが定義されおり、これに正しいパラメータが渡せればそれで完成する。
config/routes/ 配下に routes.rb を分解していくなら下の記事に書いてある方法がよさそう。
ただこれだと任意のファイルを読み込ませることができなかったので自分は別の方法を選択した。
他の解決策
ルーティングの読み込みは initializers の中の add_routing_paths
というところでやっている。
なのでその initializers の一個前に path を追加するような設定をかけば良いと思った。
具体的には config/application.rb に下記の設定を追記した。
initializer('add_my_app_routing_paths', before: 'add_routing_paths') do |app|
routing_path = root.join('lib/my_app/routes.rb')
app.routes_reloader.paths.prepend(routing_path)
end
これで一応期待したとおり lib/my_app/routes.rb で定義したルーティングが読み込まれるようになっていた。
リロードされないという副作用もなさそうだったのでこれで行くことにした。