Como faço para que um recurso herdado seja aninhado opcionalmente como um singleton?
-
13-12-2019 - |
Pergunta
Estou usando herdados_resources para DRY meus controladores, mas não consigo descobrir como fazer um controlador específico se comportar corretamente.No meu modelo, User has_one Person
.Quero que seja opcionalmente aninhado, se comporte como um singleton quando aninhado e como um não singleton quando não aninhado.Em outras palavras, quero poder listar todas as pessoas conhecidas (/people), obter a pessoa nº 5 (/person/5) e obter a única pessoa do usuário 10 (/user/10/person).O seguinte em rotas.rb:
resources :users
resource :person
end
resources :people
... configura as rotas conforme esperado:
user_person POST /users/:user_id/person(.:format) people#create
new_user_person GET /users/:user_id/person/new(.:format) people#new
edit_user_person GET /users/:user_id/person/edit(.:format) people#edit
GET /users/:user_id/person(.:format) people#show
PUT /users/:user_id/person(.:format) people#update
DELETE /users/:user_id/person(.:format) people#destroy
people GET /people(.:format) people#index
POST /people(.:format) people#create
new_person GET /people/new(.:format) people#new
edit_person GET /people/:id/edit(.:format) people#edit
person GET /people/:id(.:format) people#show
PUT /people/:id(.:format) people#update
DELETE /people/:id(.:format) people#destroy
...tão bom.Agora, se estiver no PeopleController, eu uso:
belongs_to :user, :optional => true
...então os URLs /people não aninhados funcionam, mas os URLs /users/:user_id/person aninhados não: undefined method 'people'
Se, em vez disso, no PeopleController eu usar:
belongs_to :user, :optional => true, :singleton => true
...então os URLs /users/:user_id/person aninhados funcionam, mas os URLs /people não aninhados não funcionam porque estão sendo tratados como um singleton, mesmo quando não aninhados: undefined method 'person'
Resumo:Existe uma maneira de fazer herdados_resources lidar com um recurso como um singleton quando acessado por meio de uma rota aninhada, mas como um não-singleton quando acessado por meio de uma rota não aninhada?
Solução
Caso alguém esteja tentando fazer algo semelhante, acabei abandonando os recursos_herdados.Estou descobrindo que estou mais feliz com menos “mágica” acontecendo em meus controladores.
Outras dicas
Aparentemente não é suportado: https://github.com/josevalim/inherited_resources/issues/169