Skip to main content

dynamic_route_macros

✨ DRY Route Macros with Metaprogramming

For large APIs or admin panels with repeated patterns (e.g., versioned namespaces or nested admin resources), define your own route macros to keep routes.rb clean and DRY. You can extend the ActionDispatch::Routing::Mapper to add custom methods, injecting common scopes, constraints, or defaults.

# config/initializers/route_macros.rb
module ActionDispatch::Routing
class Mapper
def versioned_api(version, **options)
namespace :api do
namespace "v#{version}" do
constraints ApiVersionConstraint.new(version: version, default: options[:default]) do
yield
end
end
end
end
end
end

# config/routes.rb
Rails.application.routes.draw do
versioned_api(1, default: true) do
resources :posts
end

versioned_api(2) do
resources :posts, only: [:index, :show]
end
end