O Roteador do Rails facilita a criação de paths e URLs sem a necessidade de criar strings fixas. Por meio dos resources
, com uma única linha de código podemos declarar as rotas para index
, show
, new
, edit
, create
, update
e destroy
atreladas a um Model
da nossa aplicação. Além disso, com rotas aninhadas é possível representar a relação lógica entre diferentes recursos, como livros de um autor por exemplo.
resources :authors do
resources :books
end
Se nos deixarmos levar, podemos implementar vários níveis de profundidade de rotas aninhadas, o que não é uma boa prática. Uma funcionalidade que nos ajuda a evitar esse tipo de implementação é o shallow nesting, que pode ser aplicado com a opção shallow: true
:
resources :authors do
resources :books, shallow: true
end
O código acima tem o mesmo resultado da implementação:
resources :authors do
resources :books, only: [:index, :new, :create]
end
resources :books, only: [:show, :edit, :update, :destroy]
A opção shallow nesting define quatro rotas no nível de livros (books) e três rotas aninhadas dentro de autores (authors).
No momento de criação de um objeto do tipo Book
, precisamos do ID de seu author para estabelecermos a associação entre eles. No entanto, depois de inicializado, o objeto já tem seu próprio ID e, por isso, pode ser acessado por um rota /books/:id
, sem a necessidade de um author. Dessa forma, as rotas :show
, :edit
, :update
e :destroy
não precisam de aninhamento, já que a relação entre livro e autor para essas ações não é importante.
São raras as situações em é necessário criar todas as ações para cada Model
. Por isso, o uso de shallow
só é recomendado caso sua aplicação realmente precise de todas estas ações. Caso contrário você pode utilizar o conceito do shallow nesting
, mas criar manualmente suas rotas.