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?

Спасибо !

Ответы на вопрос(5)

Ваш ответ на вопрос