Rails
リファクタリング
URL
routes.rb
Routing

実際のディレクトリ構造がいけてなくても見た目のURLだけは綺麗にする方法

実際のディレクトリ構造や名前がめちゃくちゃでも、次のように 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 よくできてますね。