2009-11-28 108 views
2

我想:淺嵌套導軌和路由:爲

  • 每projectpart屬於一個 項目。

  • 每個屬於 項目的解決方案(以及通過 即projectpart)的項目。

  • 每一個形象,屬於一個解決方案 (以及在項目和projectpart 通過該解決方案。)

  • 每份文件,屬於 解決方案(以及在項目和 projectpart通過該解決方案。)

  • 每個網址都以儘可能短,簡單 可能。

  • 每個「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 

...離開了一大堆的案件「項目部分」在我的網址...

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」在每一個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

你可以簡化這個問題嗎?刪除與它無關的路線。 – 2009-11-28 16:27:30

+0

完成。本來我並不想就可能與問題有關的事情做出任何假設。但現在已經回答了,我可以安全地編輯出我已經完成的無關代碼。 – 2009-12-01 11:46:27

回答

2

有關線路生成的回答你的問題是:shallow => true

提供淺層選項將爲內部資源的收集方法創建更長的路由,同時爲這些嵌套資源的成員方法提供淺層路由。仔細看看創建的路線,你會看到這個。

本質路線需要一個ID(編輯,更新,顯示,銷燬)將僅含內大部分資源的短單。不需要id(index,new)的路由會略長一些,包含直接父節點。

你不需要project_projectpart_path因爲project_projectpart項目可以從項目部分暗示。現在的項目部件只需使用projectpart_path

你的第二個例子提供了那些缺少的路由,因爲它從不給淺選項。

在urls中將'projectpart'更改爲'part'與添加: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 
+0

嗨EmFi。很棒,謝謝。我忘了提及,我希望每個項目的ID在每個項目中都是唯一的,這樣每個項目都會有一個ID爲1的項目部分,但沒有人希望會有一個ID爲132513452345的項目部分。我已將您的格式,刪除:shallow,並將其分成兩個嵌套,一個從@projects到@solutions(含),另一個從@solutions到@ images/@文檔(含)。非常感激。 – 2009-11-28 19:59:04

+0

使上下文敏感的ID不是內置於Rails中的。我從來沒有使用它,但複合主鍵插件(http://compositekeys.rubyforge.org/)應該能夠幫助你在這裏。 – EmFi 2009-11-28 20:41:49

+0

乾杯。我打算在projectparts表中添加一個partcount列,並通過friendly_id調用它,但這看起來像一個方便的選擇。 – 2009-11-29 00:20:09