¿Cómo hago un recurso heredado opcional anidado como un singleton?
-
13-12-2019 - |
Pregunta
Estoy usando inherited_resources para secar mis controladores, pero no puedo averiguar cómo hacer que un controlador en particular se comporte correctamente. En mi modelo, User has_one Person
. Quiero que esté opcionalmente anidado, se comporte como un singleton cuando está anidado, y como no singleton cuando no está anidado. En otras palabras, quiero poder listar a todas las personas conocidas (/ personas), consigue la persona # 5 (/ persona / 5) y obtenga la única persona del usuario (/ usuario / 10 / persona). Lo siguiente en rutas.rb:
resources :users
resource :person
end
resources :people
... Establece las rutas como espero:
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
... tan grande. Ahora, si en el PeopleController, yo uso:
belongs_to :user, :optional => true
... Luego, el trabajo no anidado / las personas que funcionan, pero las URLs anidadas / usuarios /: user_id / persona, no: undefined method 'people'
si, en su lugar, en el Peoplecontroller, yo uso:
belongs_to :user, :optional => true, :singleton => true
... Luego, los usuarios anidados / usuarios /: user_id / persona que funcionan, pero las URL no anidadas / personas no se incluyen porque se está tratando como un singleton, incluso cuando no está anidado: undefined method 'person'
Resumen: ¿Hay una manera de hacer que Hereited_Resources maneje un recurso como un singleton cuando se accede a través de una ruta anidada, pero como no singleton cuando se accede a través de una ruta no anidadida?
Solución
En caso de que alguien esté tratando de hacer algo similar, terminé simplemente abandonando Heredited_Resources.Estoy encontrando que soy más feliz con menos "magia" en mis controladores.
Otros consejos
Aparentemente no se admite: https://github.com/josevalim/inhered_resources/issues/169