実際のディレクトリ構造や名前がめちゃくちゃでも、次のように path オプションだけ でURLをスマートにできます。get や match などを別に駆使する必要はありません。
require "action_controller/railtie"
require "action_dispatch/routing/inspector"
app = Class.new(Rails::Application)
app.routes.draw do
namespace :gomi_api, path: "api" do
namespace :legacy, path: "" do
namespace :v3, path: "" do
resources :douga_list, path: "videos"
end
end
end
end
formatter = ActionDispatch::Routing::ConsoleFormatter.new
puts ActionDispatch::Routing::RoutesInspector.new(Rails.application.routes.routes).format(formatter)
# >> Prefix Verb URI Pattern Controller#Action
# >> gomi_api_legacy_v3_douga_list_index GET /api/videos(.:format) gomi_api/legacy/v3/douga_list#index
# >> POST /api/videos(.:format) gomi_api/legacy/v3/douga_list#create
# >> new_gomi_api_legacy_v3_douga_list GET /api/videos/new(.:format) gomi_api/legacy/v3/douga_list#new
# >> edit_gomi_api_legacy_v3_douga_list GET /api/videos/:id/edit(.:format) gomi_api/legacy/v3/douga_list#edit
# >> gomi_api_legacy_v3_douga_list GET /api/videos/:id(.:format) gomi_api/legacy/v3/douga_list#show
# >> PATCH /api/videos/:id(.:format) gomi_api/legacy/v3/douga_list#update
# >> PUT /api/videos/:id(.:format) gomi_api/legacy/v3/douga_list#update
# >> DELETE /api/videos/:id(.:format) gomi_api/legacy/v3/douga_list#destroy
include Rails.application.routes.url_helpers
gomi_api_legacy_v3_douga_list_path(1) # => "/api/videos/1"
ここでおもしろいのが path を空にできる ということです。ドキュメントには言及がなかったので、てっきり何かを書かないといけないのかと思っていましたが、試してみるとその階層をなかったことにできました。上のすべての path を空にすると URL は /
になったりもしました。さすが Rails よくできてますね。