Comment puis-je créer une ressource héritée éventuellement imbriquée en tant que singleton ?
-
13-12-2019 - |
Question
J'utilise hérité_resources pour SÉCHER mes contrôleurs, mais je n'arrive pas à comprendre comment faire en sorte qu'un contrôleur particulier se comporte correctement.Dans mon modèle, User has_one Person
.Je veux qu'il soit éventuellement imbriqué, qu'il se comporte comme un singleton lorsqu'il est imbriqué et comme un non-singleton lorsqu'il n'est pas imbriqué.En d'autres termes, je veux pouvoir lister toutes les personnes connues (/people), obtenir la personne n°5 (/person/5) et obtenir la seule personne de l'utilisateur 10 (/user/10/person).Ce qui suit dans routes.rb :
resources :users
resource :person
end
resources :people
...établit les itinéraires comme prévu :
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
...tellement bon.Maintenant, si dans le PeopleController, j'utilise :
belongs_to :user, :optional => true
...alors les URL non imbriquées /people fonctionnent, mais les URL imbriquées /users/:user_id/person ne le font pas : undefined method 'people'
Si, à la place, dans le PeopleController, j'utilise :
belongs_to :user, :optional => true, :singleton => true
...alors les URL imbriquées /users/:user_id/person fonctionnent, mais les URL non imbriquées /people ne le font pas car elles sont traitées comme un singleton, même lorsqu'elles ne sont pas imbriquées : undefined method 'person'
Résumé:Existe-t-il un moyen de faire en sorte que les ressources héritées gèrent une ressource comme un singleton lorsqu'on y accède via une route imbriquée, mais comme un non-singleton lorsqu'on y accède via une route non imbriquée ?
La solution
Au cas où quelqu'un essaierait de faire quelque chose de similaire, j'ai fini par abandonnerhered_resources.Je trouve que je suis plus heureux avec moins de « magie » dans mes contrôleurs.
Autres conseils
Il n'est apparemment pas pris en charge : https://github.com/josevalim/inherited_resources/issues/169