Wie mache ich eine inherited_resource optional als Singleton verschachtelt?
-
13-12-2019 - |
Frage
Ich verwende inherited_resources, um meine Controller zu TROCKNEN, kann aber nicht herausfinden, wie sich ein bestimmter Controller richtig verhält.In meinem Modell, User has_one Person
.Ich möchte, dass es optional verschachtelt ist, sich als Singleton verhält, wenn es verschachtelt ist, und als Nicht-Singleton, wenn es nicht verschachtelt ist.Mit anderen Worten, ich möchte in der Lage sein, alle bekannten Personen (/ Personen) aufzulisten, Person # 5 (/ person / 5) und die einzige Person von Benutzer 10 (/ Benutzer / 10 / person) zu erhalten.Das Folgende in Routen.rb:
resources :users
resource :person
end
resources :people
...richtet die Routen so ein, wie ich es erwarte:
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
...so toll.Nun, wenn im PeopleController, benutze ich:
belongs_to :user, :optional => true
...dann funktionieren die nicht verschachtelten / Personen-URLs, die verschachtelten / Benutzer /: Benutzer-ID / Personen-URLs jedoch nicht: undefined method 'people'
Wenn ich stattdessen im PeopleController verwende:
belongs_to :user, :optional => true, :singleton => true
...dann funktionieren die verschachtelten URLs / users /:user_id / person, die nicht verschachtelten URLs / people jedoch nicht, da sie als Singleton behandelt werden, auch wenn sie nicht verschachtelt sind: undefined method 'person'
Zusammenfassung:Gibt es eine Möglichkeit, inherited_resources dazu zu bringen, eine Ressource als Singleton zu behandeln, wenn auf sie über eine verschachtelte Route zugegriffen wird, aber als Nicht-Singleton, wenn auf sie über eine nicht verschachtelte Route zugegriffen wird?
Lösung
Für den Fall, dass jemand versucht, etwas Ähnliches zu tun, habe ich am Ende einfach inherited_resources aufgegeben.Ich finde, ich bin glücklicher mit weniger "Magie" in meinen Controllern.
Andere Tipps
Es wird anscheinend nicht unterstützt: https://github.com/josevalim/inherited_resources/issues/169