O roteador Rails é incrível. Mas de vez em quando encontro algo que quero fazer e não é imediatamente óbvio. Neste caso específico, eu queria ter um recurso aninhado simples com um escopo.
ie
/foos/:foo_id/:scope/bars/:id
Parece fácil, certo?
Bem, aqui estava minha primeira tentativa:
resources :foos do
member do
scope ":scope" do
resources :bars
end
end
end
Mas, para minha surpresa, isso gera o seguinte:
/foos/:id/:scope/bars/:id
Ops! Isso não é bom. Em seu controlador, você obterá apenas um desses: parâmetros de id. Na verdade, acho que pode ser um bug. Espero que, se eu tiver alguns ciclos, eu possa tentar consertá-los. No mínimo, um teste expondo o comportamento observado para ver se isso é intencional.
De qualquer forma, como solução alternativa, consegui fazer o seguinte depois de vasculhar a fonte.
resources :foos do
resources :bars, path: ":scope/children"
end
Eu não estava ciente da opção de caminho para recursos e certamente não sabia que você poderia parametrizar o caminho. Espero melhorar um pouco a documentação depois do trabalho.
*** observação: Na produção, provavelmente é uma boa ideia adicionar uma restrição personalizada para limitar os escopos parametrizados permitidos – especialmente se você estiver usando esse parâmetro como … não sei … um escopo.