O que eu gostaria de ter aprendido sobre rotas no Rails lá no início
Introdução As rotas no Rails são responsáveis por direcionar requisições HTTP para os controladores e suas respectivas ações. Elas são definidas no arquivo config/routes.rb e seguem uma estrutura declarativa que facilita a organização e manutenção do código. Este mini guia apresenta os principais conceitos sobre rotas no Rails, de forma clara e objetiva. O Básico das Rotas Definição de Rota Simples As rotas básicas no Rails podem ser definidas de maneira direta. Por exemplo: Rails.application.routes.draw do get 'home/index' end Essa rota faz com que uma requisição GET para /home/index seja direcionada para o HomeController, ação index. Rotas RESTful O Rails adota o padrão REST, permitindo a criação de rotas com um único comando: resources :posts Isso gera automaticamente as sete rotas principais para um recurso posts: GET /posts → Lista todos os posts (index) GET /posts/:id → Mostra um post específico (show) GET /posts/new → Exibe o formulário de criação (new) POST /posts → Cria um novo post (create) GET /posts/:id/edit → Exibe o formulário de edição (edit) PATCH/PUT /posts/:id → Atualiza um post (update) DELETE /posts/:id → Exclui um post (destroy) Definindo um Recurso Manualmente (Sem resources) Nem sempre usamos o helper resources. Podemos definir manualmente as rotas para um recurso completo, como countries, caso queiramos mais controle ou aprendizado. get '/countries', to: 'countries#index', as: 'countries' get '/countries/new', to: 'countries#new', as: 'new_country' post '/countries', to: 'countries#create' get '/countries/:id', to: 'countries#show', as: 'country' get '/countries/:id/edit', to: 'countries#edit', as: 'edit_country' patch '/countries/:id', to: 'countries#update' put '/countries/:id', to: 'countries#update' delete '/countries/:id', to: 'countries#destroy' Explicação GET /countries → Lista todos os países (index) GET /countries/new → Formulário de novo país (new) POST /countries → Cria um novo país (create) GET /countries/:id → Exibe detalhes de um país (show) GET /countries/:id/edit → Formulário de edição (edit) PATCH/PUT /countries/:id → Atualiza o país (update) DELETE /countries/:id → Remove o país (destroy) Vantagens e Uso Essa abordagem é útil quando: Você quer personalizar cada rota com mais liberdade Deseja evitar geração automática de rotas não utilizadas Precisa de nomes específicos para as rotas Além disso, os helpers de caminho continuam disponíveis: countries_path new_country_path country_path(@country) edit_country_path(@country) Rotas Aninhadas Quando há um relacionamento entre recursos, podemos usar rotas aninhadas para estruturar as URLs: resources :countries do resources :states do resources :cities end end Isso gera caminhos como: /countries/:country_id/states/:state_id/cities/:id Interpretando Paths em Rotas Profundas Entender como interpretar paths em rotas aninhadas é essencial para evitar erros e construir URLs corretamente. Vamos analisar um exemplo: Estrutura de Rotas resources :universities do resources :departments do resources :professors do member do get 'profile' # /universities/:university_id/departments/:department_id/professors/:id/profile end end end end Como Ler e Construir Helpers de Caminho Dado o exemplo acima, podemos identificar como construir corretamente as URLs. Para listar todos os departamentos de uma universidade: university_departments_path(@university) # => '/universities/:university_id/departments' Para acessar um departamento específico: university_department_path(@university, @department) # => '/universities/:university_id/departments/:id' Para acessar os professores de um departamento específico: department_professors_path(@university, @department) # => '/universities/:university_id/departments/:department_id/professors' Para acessar o perfil de um professor: profile_professor_path(@university, @department, @professor) # => '/universities/:university_id/departments/:department_id/professors/:id/profile' Dicas para Interpretação de Paths A ordem dos argumentos importa: Sempre forneça os IDs dos recursos pais antes dos filhos. Use rake routes: Esse comando exibe todas as rotas disponíveis e seus respectivos helpers. Analise a hierarquia: Cada recurso dentro de outro exige os IDs dos níveis superiores. Verifique o nome dos helpers: Rails gera nomes padronizados baseados na estrutura definida em routes.rb. Buscando Rotas Específicas Ao trabalhar com um grande número de rotas, pode ser desafiador encontrar uma específica. O Rails fornece algumas ferramentas para facilitar essa busca. Usando rake routes | grep Podemos filtrar rotas us

Introdução
As rotas no Rails são responsáveis por direcionar requisições HTTP para os controladores e suas respectivas ações. Elas são definidas no arquivo config/routes.rb
e seguem uma estrutura declarativa que facilita a organização e manutenção do código. Este mini guia apresenta os principais conceitos sobre rotas no Rails, de forma clara e objetiva.
O Básico das Rotas
Definição de Rota Simples
As rotas básicas no Rails podem ser definidas de maneira direta. Por exemplo:
Rails.application.routes.draw do
get 'home/index'
end
Essa rota faz com que uma requisição GET
para /home/index
seja direcionada para o HomeController
, ação index
.
Rotas RESTful
O Rails adota o padrão REST, permitindo a criação de rotas com um único comando:
resources :posts
Isso gera automaticamente as sete rotas principais para um recurso posts
:
-
GET /posts
→ Lista todos os posts (index) -
GET /posts/:id
→ Mostra um post específico (show) -
GET /posts/new
→ Exibe o formulário de criação (new) -
POST /posts
→ Cria um novo post (create) -
GET /posts/:id/edit
→ Exibe o formulário de edição (edit) -
PATCH/PUT /posts/:id
→ Atualiza um post (update) -
DELETE /posts/:id
→ Exclui um post (destroy)
Definindo um Recurso Manualmente (Sem resources
)
Nem sempre usamos o helper resources
. Podemos definir manualmente as rotas para um recurso completo, como countries
, caso queiramos mais controle ou aprendizado.
get '/countries', to: 'countries#index', as: 'countries'
get '/countries/new', to: 'countries#new', as: 'new_country'
post '/countries', to: 'countries#create'
get '/countries/:id', to: 'countries#show', as: 'country'
get '/countries/:id/edit', to: 'countries#edit', as: 'edit_country'
patch '/countries/:id', to: 'countries#update'
put '/countries/:id', to: 'countries#update'
delete '/countries/:id', to: 'countries#destroy'
Explicação
-
GET
/countries
→ Lista todos os países (index
) -
GET
/countries/new
→ Formulário de novo país (new
) -
POST
/countries
→ Cria um novo país (create
) -
GET
/countries/:id
→ Exibe detalhes de um país (show
) -
GET
/countries/:id/edit
→ Formulário de edição (edit
) -
PATCH/PUT
/countries/:id
→ Atualiza o país (update
) -
DELETE
/countries/:id
→ Remove o país (destroy
)
Vantagens e Uso
Essa abordagem é útil quando:
- Você quer personalizar cada rota com mais liberdade
- Deseja evitar geração automática de rotas não utilizadas
- Precisa de nomes específicos para as rotas
Além disso, os helpers de caminho continuam disponíveis:
countries_path
new_country_path
country_path(@country)
edit_country_path(@country)
Rotas Aninhadas
Quando há um relacionamento entre recursos, podemos usar rotas aninhadas para estruturar as URLs:
resources :countries do
resources :states do
resources :cities
end
end
Isso gera caminhos como:
/countries/:country_id/states/:state_id/cities/:id
Interpretando Paths em Rotas Profundas
Entender como interpretar paths em rotas aninhadas é essencial para evitar erros e construir URLs corretamente. Vamos analisar um exemplo:
Estrutura de Rotas
resources :universities do
resources :departments do
resources :professors do
member do
get 'profile' # /universities/:university_id/departments/:department_id/professors/:id/profile
end
end
end
end
Como Ler e Construir Helpers de Caminho
Dado o exemplo acima, podemos identificar como construir corretamente as URLs.
- Para listar todos os departamentos de uma universidade:
university_departments_path(@university)
# => '/universities/:university_id/departments'
- Para acessar um departamento específico:
university_department_path(@university, @department) # => '/universities/:university_id/departments/:id'
- Para acessar os professores de um departamento específico:
department_professors_path(@university, @department) # => '/universities/:university_id/departments/:department_id/professors'
- Para acessar o perfil de um professor:
profile_professor_path(@university, @department, @professor) # => '/universities/:university_id/departments/:department_id/professors/:id/profile'
Dicas para Interpretação de Paths
- A ordem dos argumentos importa: Sempre forneça os IDs dos recursos pais antes dos filhos.
-
Use
rake routes
: Esse comando exibe todas as rotas disponíveis e seus respectivos helpers. - Analise a hierarquia: Cada recurso dentro de outro exige os IDs dos níveis superiores.
-
Verifique o nome dos helpers: Rails gera nomes padronizados baseados na estrutura definida em
routes.rb
.
Buscando Rotas Específicas
Ao trabalhar com um grande número de rotas, pode ser desafiador encontrar uma específica. O Rails fornece algumas ferramentas para facilitar essa busca.
Usando rake routes | grep
Podemos filtrar rotas usando grep
para encontrar apenas as que nos interessam:
rake routes | grep users
Isso retorna apenas as rotas que contêm users
no nome ou caminho.
Usando rails routes -g
Uma alternativa mais eficiente no Rails 5+ é o comando:
rails routes -g users
Ele tem a mesma função do grep
, mas de forma mais otimizada, sem a necessidade de encadear comandos.
Nomeação e Redirecionamento
Nomeando Rotas
Nomear rotas facilita seu uso no código:
get 'about', to: 'pages#about', as: 'about_page'
Agora podemos chamar about_page_path
em vez de escrever manualmente '/about'
.
Redirecionamento de Rotas
Podemos redirecionar URLs antigas para novas:
get '/old_route', to: redirect('/new_route')
Conclusão
As rotas são fundamentais para qualquer aplicação Rails, permitindo estruturar URLs de forma eficiente e organizada. O uso de helpers de caminho simplifica a navegação, enquanto rotas nomeadas e personalizadas tornam o código mais legível e fácil de manter. Além disso, aprender a interpretar paths e buscar rotas específicas com rails routes -g
ou grep
facilita a manutenção e depuração da aplicação. Com esse conhecimento, você pode criar aplicações escaláveis e bem estruturadas!