Der folgende Beitrag basiert auf Rails 4.Rails 4 [Best Practices] Verschachtelte Ressourcen und flach: true
Ich suche eigentlich für eine gute Best-Practices über die mehr verschachtelten Ressourcen (mehr als 1), und die Option flach: wahr.
Erste in meiner Routen gab es dies:
resources :projects do
resources :collections
end
Die Routen zugeordnet sind:
project_collections GET /projects/:project_id/collections(.:format) collections#index
POST /projects/:project_id/collections(.:format) collections#create
new_project_collection GET /projects/:project_id/collections/new(.:format) collections#new
edit_project_collection GET /projects/:project_id/collections/:id/edit(.:format) collections#edit
project_collection GET /projects/:project_id/collections/:id(.:format) collections#show
PATCH /projects/:project_id/collections/:id(.:format) collections#update
PUT /projects/:project_id/collections/:id(.:format) collections#update
DELETE /projects/:project_id/collections/:id(.:format) collections#destroy
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
ich in der Dokumentation über die Begrenzung der verschachtelten Ressourcen lesen:
Ressourcen sollten nie mehr als 1 Ebene tief verschachtelt sein.
Quelle: http://guides.rubyonrails.org/routing.html#limits-to-nesting Ok. Dann, wie die Dokumentation sagte, werde ich "seicht" auf meinen Routen verwenden.
shallow do
resources :projects do
resources :collections
end
end
Die zugehörigen Routen sind:
project_collections GET /projects/:project_id/collections(.:format) collections#index
POST /projects/:project_id/collections(.:format) collections#create
new_project_collection GET /projects/:project_id/collections/new(.:format) collections#new
edit_collection GET /collections/:id/edit(.:format) collections#edit
collection GET /collections/:id(.:format) collections#show
PATCH /collections/:id(.:format) collections#update
PUT /collections/:id(.:format) collections#update
DELETE /collections/:id(.:format) collections#destroy
projects GET /projects(.:format) projects#index
POST /projects(.:format) projects#create
new_project GET /projects/new(.:format) projects#new
edit_project GET /projects/:id/edit(.:format) projects#edit
project GET /projects/:id(.:format) projects#show
PATCH /projects/:id(.:format) projects#update
PUT /projects/:id(.:format) projects#update
DELETE /projects/:id(.:format) projects#destroy
Der wesentliche Unterschied sehe ich die "Show" von Sammlungen ist, diese:
collection GET /collections/:id(.:format) collections#show
Also, wenn ich ich habe recht, Der Link für die Show-Aktion für eine Sammlung lautet:
<%= link_to 'Show", collection_path(collection)%>
und sollte so etwas zurückgeben: "http://example.com/collections/1"
ABER! 2 Dinge:
- Dies funktioniert nicht. Ich bekomme stattdessen "http://example.com/projects/1". WTF?
- Auch wenn es funktioniert, es ist eigentlich ziemlich schlecht ist, weil ich den Rest Grund verlieren, die sagen, localhost/Projekt/1/Sammlungen/1 ‚
„Collection ist Kind des Projektes, dann sollte die URL sein‘ Ich verstehe nicht, was das Interesse von seicht ist, wenn es den großen Vorteil von Ruheaktionen verliert. Was ist das Interesse? Und was ist das Interesse daran, die "Show" -Aktion zu verlieren? Ich habe dies bereits in SO gepostet, aber der einzige Kommentar Ich habe ist "Es ist etwas normales". WTF? In was das ist ein normales Verhalten zu "entfernen" eine Aktion aus dem Rest API?
Ich reproduzierte das Problem auf ein neutrales Projekt, um sicher zu sein, dass ich nicht tat etwas stimmt nicht, und das gleiche Problem ist passiert. Also, ja, es kann für die Helfer bequem sein, seicht zu verwenden, aber es ist NICHT ALLES bequem für den Rest, Sie verlieren alle Interessen von "eine Sammlung ist verschachtelt zu einem Projekt, so dass dies in der URL widergespiegelt wird".
Ich weiß nicht, ob es einen anderen Weg, dies zu tun, es ist wahr, dass seichte mehr Flexibilität über die Helfer erlauben, aber es ist falsch, dass es konform Ruhe. Also, gibt es eine Chance, die "Helfer" zum Arbeiten zu bringen (es ist ziemlich toll, "nested3_path (collection)" anstelle von "nested1_nested2_nested3 ([nested1.nested2.nested3, nested1.nested2, nested1])" zu haben, und die " URL-Teil "und behalten" Nested1/123/Nested2/456/Nested3/789?
Danke!
Haben Sie versucht, den Server neu zu starten, damit die Routen wirksam werden? Nach dem doc 'Ressourcen: Beiträge, seichte: true tun Ressourcen: Kommentare end' produzieren ' Ressourcen: Beiträge tun Ressourcen: Kommentare, außer: [: show, bearbeiten,: update, : destroy] ende resources: nur kommentare: [: show,: bearbeiten,: update,: destroy] ' die klingen wie du machst – jamesy829
Der Server muss tatsächlich neu gestartet werden, damit die Routen wirksam werden. – 0112