Shallow Nesting em Ruby on Rails

Dicas - 16/Ago/2020 - por André Kanamura

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.

Referências

Foto de perfil do autor
André Kanamura

Dev na Campus Code