Малая вложенная Rails-маршрутизация с: as - PullRequest
2 голосов
/ 28 ноября 2009

Я хочу:

  • Каждая часть проекта принадлежит проект.

  • Каждое решение принадлежит Projectart (и в проект через часть проекта).

  • Каждое изображение принадлежит решению (и для проекта и части проекта через это решение.)

  • Каждый документ, принадлежащий решение (и для проекта и Projectpart через это решение.)

  • Каждый URL должен быть коротким и простым возможно.

  • Появляется каждый случай "projectpart" как «часть» в каждом URL. (Я не мог назовите модель "деталь" на Heroku.)

Может кто-нибудь сказать мне, почему это ...

ActionController::Routing::Routes.draw do |map|
  map.resources :projects, :shallow => true do |project|
    project.resources :projectparts do |part|
      part.resources :solutions do |solution|
        solution.resources :images
        solution.resources :documents
      end
    end
  end
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

... оставляет целую кучу случаев "projectpart" в моих URL-адресах ...

steven-nobles-imac-200:drominay steven$ rake routes
(in /Users/steven/Drominay)

                          projects GET    /projects                                           {:controller=>"projects", :action=>"index"}
                formatted_projects GET    /projects.:format                                   {:controller=>"projects", :action=>"index"}
                                   POST   /projects                                           {:controller=>"projects", :action=>"create"}
                                   POST   /projects.:format                                   {:controller=>"projects", :action=>"create"}
                       new_project GET    /projects/new                                       {:controller=>"projects", :action=>"new"}
             formatted_new_project GET    /projects/new.:format                               {:controller=>"projects", :action=>"new"}
                      edit_project GET    /projects/:id/edit                                  {:controller=>"projects", :action=>"edit"}
            formatted_edit_project GET    /projects/:id/edit.:format                          {:controller=>"projects", :action=>"edit"}
                           project GET    /projects/:id                                       {:controller=>"projects", :action=>"show"}
                 formatted_project GET    /projects/:id.:format                               {:controller=>"projects", :action=>"show"}
                                   PUT    /projects/:id                                       {:controller=>"projects", :action=>"update"}
                                   PUT    /projects/:id.:format                               {:controller=>"projects", :action=>"update"}
                                   DELETE /projects/:id                                       {:controller=>"projects", :action=>"destroy"}
                                   DELETE /projects/:id.:format                               {:controller=>"projects", :action=>"destroy"}
              project_projectparts GET    /projects/:project_id/projectparts                  {:controller=>"projectparts", :action=>"index"}
    formatted_project_projectparts GET    /projects/:project_id/projectparts.:format          {:controller=>"projectparts", :action=>"index"}
                                   POST   /projects/:project_id/projectparts                  {:controller=>"projectparts", :action=>"create"}
                                   POST   /projects/:project_id/projectparts.:format          {:controller=>"projectparts", :action=>"create"}
           new_project_projectpart GET    /projects/:project_id/projectparts/new              {:controller=>"projectparts", :action=>"new"}
 formatted_new_project_projectpart GET    /projects/:project_id/projectparts/new.:format      {:controller=>"projectparts", :action=>"new"}
                  edit_projectpart GET    /projectparts/:id/edit                              {:controller=>"projectparts", :action=>"edit"}
        formatted_edit_projectpart GET    /projectparts/:id/edit.:format                      {:controller=>"projectparts", :action=>"edit"}
                       projectpart GET    /projectparts/:id                                   {:controller=>"projectparts", :action=>"show"}
             formatted_projectpart GET    /projectparts/:id.:format                           {:controller=>"projectparts", :action=>"show"}
                                   PUT    /projectparts/:id                                   {:controller=>"projectparts", :action=>"update"}
                                   PUT    /projectparts/:id.:format                           {:controller=>"projectparts", :action=>"update"}
                                   DELETE /projectparts/:id                                   {:controller=>"projectparts", :action=>"destroy"}
                                   DELETE /projectparts/:id.:format                           {:controller=>"projectparts", :action=>"destroy"}
             projectpart_solutions GET    /projectparts/:projectpart_id/solutions             {:controller=>"solutions", :action=>"index"}
   formatted_projectpart_solutions GET    /projectparts/:projectpart_id/solutions.:format     {:controller=>"solutions", :action=>"index"}
                                   POST   /projectparts/:projectpart_id/solutions             {:controller=>"solutions", :action=>"create"}
                                   POST   /projectparts/:projectpart_id/solutions.:format     {:controller=>"solutions", :action=>"create"}
          new_projectpart_solution GET    /projectparts/:projectpart_id/solutions/new         {:controller=>"solutions", :action=>"new"}
formatted_new_projectpart_solution GET    /projectparts/:projectpart_id/solutions/new.:format {:controller=>"solutions", :action=>"new"}
                     edit_solution GET    /solutions/:id/edit                                 {:controller=>"solutions", :action=>"edit"}
           formatted_edit_solution GET    /solutions/:id/edit.:format                         {:controller=>"solutions", :action=>"edit"}
                          solution GET    /solutions/:id                                      {:controller=>"solutions", :action=>"show"}
                formatted_solution GET    /solutions/:id.:format                              {:controller=>"solutions", :action=>"show"}
                                   PUT    /solutions/:id                                      {:controller=>"solutions", :action=>"update"}
                                   PUT    /solutions/:id.:format                              {:controller=>"solutions", :action=>"update"}
                                   DELETE /solutions/:id                                      {:controller=>"solutions", :action=>"destroy"}
                                   DELETE /solutions/:id.:format                              {:controller=>"solutions", :action=>"destroy"}
                   solution_images GET    /solutions/:solution_id/images                      {:controller=>"images", :action=>"index"}
         formatted_solution_images GET    /solutions/:solution_id/images.:format              {:controller=>"images", :action=>"index"}
                                   POST   /solutions/:solution_id/images                      {:controller=>"images", :action=>"create"}
                                   POST   /solutions/:solution_id/images.:format              {:controller=>"images", :action=>"create"}
                new_solution_image GET    /solutions/:solution_id/images/new                  {:controller=>"images", :action=>"new"}
      formatted_new_solution_image GET    /solutions/:solution_id/images/new.:format          {:controller=>"images", :action=>"new"}
                        edit_image GET    /images/:id/edit                                    {:controller=>"images", :action=>"edit"}
              formatted_edit_image GET    /images/:id/edit.:format                            {:controller=>"images", :action=>"edit"}
                             image GET    /images/:id                                         {:controller=>"images", :action=>"show"}
                   formatted_image GET    /images/:id.:format                                 {:controller=>"images", :action=>"show"}
                                   PUT    /images/:id                                         {:controller=>"images", :action=>"update"}
                                   PUT    /images/:id.:format                                 {:controller=>"images", :action=>"update"}
                                   DELETE /images/:id                                         {:controller=>"images", :action=>"destroy"}
                                   DELETE /images/:id.:format                                 {:controller=>"images", :action=>"destroy"}
                solution_documents GET    /solutions/:solution_id/documents                   {:controller=>"documents", :action=>"index"}
      formatted_solution_documents GET    /solutions/:solution_id/documents.:format           {:controller=>"documents", :action=>"index"}
                                   POST   /solutions/:solution_id/documents                   {:controller=>"documents", :action=>"create"}
                                   POST   /solutions/:solution_id/documents.:format           {:controller=>"documents", :action=>"create"}
             new_solution_document GET    /solutions/:solution_id/documents/new               {:controller=>"documents", :action=>"new"}
   formatted_new_solution_document GET    /solutions/:solution_id/documents/new.:format       {:controller=>"documents", :action=>"new"}
                     edit_document GET    /documents/:id/edit                                 {:controller=>"documents", :action=>"edit"}
           formatted_edit_document GET    /documents/:id/edit.:format                         {:controller=>"documents", :action=>"edit"}
                          document GET    /documents/:id                                      {:controller=>"documents", :action=>"show"}
                formatted_document GET    /documents/:id.:format                              {:controller=>"documents", :action=>"show"}
                                   PUT    /documents/:id                                      {:controller=>"documents", :action=>"update"}
                                   PUT    /documents/:id.:format                              {:controller=>"documents", :action=>"update"}
                                   DELETE /documents/:id                                      {:controller=>"documents", :action=>"destroy"}
                                   DELETE /documents/:id.:format                              {:controller=>"documents", :action=>"destroy"}
                                          /:controller/:action/:id                            
                                          /:controller/:action/:id.:format   

... и все же не генерирует основные URL-помощники, как это?

undefined method `project_projectpart_path' for #<ActionView::Base:0x3438ffc> (ActionView::TemplateError)

Кстати, все, кроме изменения "projectpart" на "part" в каждом URL, работало нормально с таким более подробным синтаксисом:

ActionController::Routing::Routes.draw do |map|


  map.resources :projects, :has_many => :projectparts
  map.resources :projects, :has_many => :solutions
  map.resources :projects, :has_many => :images
  map.resources :projects, :has_many => :documents
  map.resources :projectparts, :has_many => :solutions
  map.resources :projectparts, :has_many => :images
  map.resources :projectparts, :has_many => :documents
  map.resources :solutions, :has_many => :images
  map.resources :solutions, :has_many => :documents
  map.resources :images
  map.resources :documents


  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

end

1 Ответ

2 голосов
/ 28 ноября 2009

Ответ на ваш вопрос о генерации маршрута: :shallow => true

Предоставление опции мелкого создания создаст более длинные маршруты для методов сбора внутреннего ресурса (ов), в то же время предоставляя поверхностные маршруты для методов-членов этих вложенных ресурсов. Присмотритесь к созданным маршрутам, и вы увидите это.

По существу, маршруты, которым нужен идентификатор (редактировать, обновлять, показывать, уничтожать), будут короткими, содержащими только самый внутренний ресурс. Маршруты, которые не нуждаются в идентификаторе (index, new), будут немного длиннее и содержат непосредственного родителя.

Вам не нужно project_projectpart_path, потому что проект в project_projectpart может подразумеваться из части проекта. Вместо этого просто используйте projectpart_path для существующих частей проекта.

Ваш второй пример предоставляет эти пропущенные маршруты, потому что он никогда не дает мелкой опции.

Изменить 'projectpart' на 'part' в URL-адресе так же просто, как добавить параметр: as в его определение. Извините, это не будет работать с сокращением: has_many версия

map.resources :projects, :shallow => true do |project|
  project.resources :projectparts, :as => "part" do |part|
    part.resources :solutions do |solution|
      solution.resources :images
      solution.resources :documents
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...