Rails 4 [Лучшие практики] Вложенные ресурсы и мелкие: правда
Следующий пост основан на Rails 4.
Я на самом деле ищу хорошие передовые практики для нескольких вложенных ресурсов (более 1), и вариант мелкий: 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
Так что, если я прав, ссылка на действие шоу для коллекции:
<%= link_to 'Show", collection_path(collection)%>
и должен вернуть что-то вроде этого: "http://example.com/collections/1"
НО ! 2 вещи:
Это не работает. Я получаю вместо "http://example.com/projects/1". WTF?Даже если это работает, это на самом деле довольно плохо, потому что я теряю основную часть REST, которая говорит: «Коллекция является дочерним элементом проекта, тогда URL должен быть« localhost / project / 1 / collection / 1 ».Я не понимаю, в чем состоит интерес мелководья, если оно теряет большое преимущество действий Отдыха. Какой интерес? И какой интерес потерять действие «Шоу»? Я уже разместил это на SO, но единственный комментарий, который я получил, это «Это что-то нормальное». WTF? В чем заключается нормальное поведение «удалить» действие из остальных API?
Я воспроизвел проблему на нейтральном проекте, чтобы быть уверенным, что я не делал что-то не так, и такая же проблема произошла. Так что, да, помощникам может быть удобно использовать поверхностный доступ, но в остальном это совсем НЕ удобно, вы теряете интерес «одна коллекция вложена в один проект, поэтому это отражается в URL».
Я не знаю, есть ли другой способ сделать это, это правда, что мелкие допускают большую гибкость в отношении помощников, но неверно, что это соответствует требованиям покоя. Таким образом, есть ли шанс заставить «помощников» работать (довольно здорово иметь «nested3_path (collection)» вместо «nested1_nested2_nested3 ([nested1.nested2.nested3, nested1.nested2, nested1])» и сохранять « URL часть "и продолжать иметь" nested1 / 123 / nested2 / 456 / nested3 / 789?
Спасибо !