Следующая публикация основана на Rails 4.
Я действительно ищу хорошие передовые практики в отношении нескольких вложенных ресурсов (более 1), а опция small: true.
Сначала в моих маршрутах было следующее:
resources :projects do
resources :collections
end
Связанные маршруты:
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
Я прочитал в документации об ограничении вложенных ресурсов:
Ресурсы никогда не должны вставляться в глубину более 1 уровня.
Источник: http://guides.rubyonrails.org/routing.html#limits-to-nesting ОК. Затем, как и в документации, я буду использовать "мелкие" на своих маршрутах.
shallow do
resources :projects do
resources :collections
end
end
Связанные маршруты:
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
Основное отличие, которое я вижу, это "показ" коллекций, этот:
collection GET /collections/:id(.:format) collections#show
Итак, если я прав, ссылка для действия show для коллекции:
<%= link_to 'Show", collection_path(collection)%>
и должен возвращать что-то вроде этого: " http://example.com/collections/1"
НО! 2 вещи:
- Это не работает. Я получаю вместо этого http://example.com/projects/1". WTF?
- Даже если он работает, это действительно очень плохо, потому что я теряю базовый элемент REST, который говорит: "Коллекция - это проект проекта, тогда URL должен быть" localhost/project/1/collections/1 "
Я не понимаю, какой интерес представляет мелкий, если он потеряет большое преимущество действий Rest. Какой интерес? И в чём заключается интерес потерять действие "Шоу"? Я уже разместил это для SO, но единственный комментарий, который я получил, это "Это что-то нормальное". WTF? В чем это нормальное поведение, чтобы "удалить" действие из остального API?
Я воспроизвел проблему в нейтральном проекте, чтобы быть уверенным, что я не делаю что-то неправильно, и эта же проблема произошла. Итак, да, может быть удобно, чтобы хелперы использовали мелкие, но не ВСЕ, удобные для остальных, вы теряете всю заинтересованность "одна коллекция вложен в один проект, поэтому это отражается в URL".
Я не знаю, есть ли другой способ сделать это, правда, что неглубокие позволяют большую гибкость в отношении помощников, но это ложно, что он соответствует требованиям. Итак, есть ли шанс заставить "помощников" работать (довольно просто, чтобы иметь "nested3_path (collection)" вместо "nested1_nested2_nested3" ([nested1.nested2.nested3, nested1.nested2, nested1]) "и сохранение" url part "и сохранить" nested1/123/nested2/456/nested3/789?
Спасибо!