title: Routes description: How HTTP methods map to controllers and actions. menu: docs:
weight: 40
parent: dev
{{< caption-link url="https://github.com/mastodon/mastodon/blob/main/config/routes.rb" caption="config/routes.rb" >}}
Mastodon uses Ruby on Rails, which defines its router configuration at config/routes.rb. You may view the Ruby on Rails routing guide for more detailed information, but this page will explain the basics of how Mastodon handles routing.
namespace
is a prefix for routes mapped to a certain controller directory. resources
are mapped to controllers within that namespace directory. scope
passes to the module
's controller. For example, consider the following abbreviated code:
{{< code title="config/routes.rb excerpt" >}}
namespace :api do
namespace :v1 do
resources :statuses, only [:create, :show, :destroy] do
scope module: :statuses do
resource :favourite, only: :create
resource :unfavourite, to: 'favourites#destroy'
member do
get :context
end
end
end
end
end
{{< /code >}}
The first available resource is :statuses, which is nested under the :api and :v1 namespaces. Thus, the resulting HTTP route will be /api/v1/statuses. The only
defines certain allowed methods, which are to be defined in the controller at app/controllers/api/v1/statuses_controller.rb
.
Within /api/v1/statuses, there is a scope for a module :statuses, where additional resources are defined. The controllers for these resources live in app/controllers/api/v1/statuses/
. For example, :favourite will be handled by the #create action within app/controllers/api/v1/statuses/favourites_controller.rb
and :unfavourite will be handled within the same controller, but by the #destroy action.
There is also a custom method defined for any member
within this scope, or in other words, for any status to be controlled by app/controllers/api/v1/statuses_controller.rb
, which is mapped to GET /api/v1/statuses/:id/context and handled by the :context action defined within that controller.
Maps to HTTP GET, for a list. Handled by the #index action in a controller.
Maps to HTTP GET, for a single view. Handled by the #show action in a controller.
Maps to HTTP POST. Handled by the #create action in a controller.
Maps to HTTP PUT. Handled by the #update action in a controller.
Maps to HTTP DELETE. Handled by the #destroy action in a controller.
Extensible Resource Descriptor (XRD). Advertises existence of Webfinger.
Maps to NodeInfo 2.0 endpoint at /nodeinfo/2.0
, used for advertising software name and version, protocols, usage statistics, and whether registrations are open.
Used for discovering ActivityPub actor id. See Spec compliance > WebFinger for more information.
Maps to account settings page.
Used for integration with Keybase, defining which usernames are acceptable and where proofs may be checked.
{{< hint style="warning" >}} The sections below this point are under construction. {{< /hint >}}
/users/username
= user URI/users/username/remote_follow
= remote follow dialog/users/username/statuses/id
= status URI/@username
= "posts" tab/@username/with_replies
= "posts and replies" tab/@username/media
= "media" tab/@username/tagged/:hashtag
= tagged statuses by user/@username/:status_id
= status permalink/@username/:status_id/embed
= embeddable version/interact/:status_id
= remote interaction dialog/explore
= profile directory/explore/:hashtag
= profiles with this hashtag in bio/public
= public timeline preview/about
= landing page/about/more
= extended description/terms
= terms of service