2009-11-28 59 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