Routing in Rails
Tags: rails, beginners, tutorial, ruby
Published: 2022-12-12 18:19:19


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wcq1pljvyiz8m97lse1f.png)



**What exactly is routing?**

When there's an HTTP request from the user to the application, it should be directed to the right controller. You can picture a router as a receptionist at who connects you to the right person to talk to.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nnw2kdw6bfbzunsw2czv.png)



**How is routing done in Ruby on Rails?**

In Rails, the routes of your application live in config/routes.rb. The Rails router recognizes URLs and dispatches them to a controller's action. It can also generate paths and URLs, avoiding the need to hardcode strings in your views. Let's consider an application to book rooms in different Hotels and take a look at how this works.

**Types of HTTP request methods:**

The application receives an HTTP request which carries along with it a method which could be:

- GET - Retrieve a resource
- POST - Create a resource
- PUT - Completely update a resource
- PATCH - Partially update a resource
- DELETE - Delete a resource

These methods determine which controller action method is called.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mhnlhsdult85f3qp9a8f.png)

**Decoding the http request**

If the application receives the request, GET /players/1. The request is dispatched to the players controller's show action with { id: '1' } in params.

get '/teams/:id', to: 'teams#show'

Similarly,

```
get '/teams', to: 'teams#index'
get '/teams/:id', to: 'teams#show'
get '/teams/new', to: 'teams#new'
post '/teams', to: 'teams#create'
get '/teams/:id/edit', to: 'teams#edit'
put '/teams/:id', to: 'teams#update'
delete '/teams/:id', to: 'teams#destroy'

```
**Defining resources**

Like how the team manger holds a record of all the players, the application too has its own record in config/routes.rb.

```
Rails.application.routes.draw do
  resources :teams
end

```
By writing resources :teams we create all seven different routes in your application, all mapping to the Teams controller like mentioned above.

If your controller has only a few of these actions you can alter the same with the following keywords.

The keyword only includes only the actions mentioned. resources :teams, only: [:edit]

There's also the keyword except to name the ones you don't want to include.

resources :teams, except: [:index]

```
resources :players,
resources :teams
```

**Nested Resources**
Sometimes we have nested routes, /teams/:id/players which are a result of resources that are logically children of other resources. For example, suppose your application includes these models:

```
class Team < ApplicationRecord
  has_many :players
end

class Player < ApplicationRecord
  belongs_to :teams
end
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sqvof3fq8k36s8l410g4.png)

In which case we will declare our resources this way,'

```
resources :teams do
  resources :players
end

```
This declaration helps us access the nested URLs such as /teams/:id/players , /teams/:id/players/:id , /teams/:id/players/new etc