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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top