2010-06-24 76 views
1

我有三個相關機型:公司,項目,鏈接,和我想創建,我們根據他們所創造的鏈接生成路由系統,例如:用戶定義的路由

www.site.com/the_company's_specific_path/one_of_company's_links 

一公司has_many:項目,一個項目has_many:鏈接。

概要結構:

#Company table 
company.id 
company.path # such as 'Bechtel' 

#Project table 
project.id 
project.company_id 

#Link table 
link.id 
link.link # such as 'railwayproject' 
link.project_id 
link.company_id # some links may be tied to the company and not one specific project 

#Final route generated: www.site.com/bechtel/railwayproject 

我怎樣才能建立這個系統,以便:

  • 路線的第1部分指定company.path(沿@company = Company.find_by_path(params[:path])線)
  • 第2部分找到鏈接(沿線@link = Link.find_by_link_and_company_id(params[:link],@company.id)
  • 一旦輸入此URI/URL,用戶輸入'show',他們在那裏看到項目或公司。 (當一個鏈接沒有專門綁定到一個項目時,我們會顯示'列表',而不是顯示公司的所有項目。)

如果由於任何原因導致上述內容不清楚,我表示歉意。我試圖儘可能地解釋!謝謝。

+0

@neutrino:它看起來像你的編輯增加了額外的括號,不應該在那裏。 – Awgy 2010-06-24 08:49:21

+0

@Awgy它正在關閉「鏈接(沿着...」:)作者在第一點匹配parens和第二個不匹配,所以我決定修復它:) – 2010-06-24 10:53:01

+0

@neutrino:我完全現在看到。我昨晚盯着修改版,試圖確定並完全錯過了開頭的括號。對不起= = – Awgy 2010-06-24 20:01:33

回答

1

您應該查看有關該主題的ActionController::Routing,ActionController::Resources(適用於RESTful路由)以及方便的Rails Guide的文檔。還有一些Railscasts regarding routes

只要簡單到map.connect :path/:link, :controller => :companies就可以工作,但根據您現有的路由可能會導致一些問題,並且不是RESTful。如果它不會引起任何衝突,這可以讓你做你想要的東西。

可以使用約束增加至路線:要求選項來縮小東西被認爲是匹配的:

map.company_link :company/:link, :requirements => { :company => /[\w\-]+/, :link => /[\w\-]+/ } 

這隻會匹配單詞和破折號 - 在url(「」)字符,我相信默認路線仍然可以正常工作。我還做了它map.company_link命名路由,這樣的Rails創建一組網址助手允許容易參考路線:company_link_path(:company => "Bechtel", :link => "railwayproject")

如果你想這樣做的REST方式堅持是:

map.resource :companies do |company| 
    company.resources :links 
end 

/companies/1/links/2將作爲參數傳遞給links_controller的show動作,並將公司和鏈接ID傳遞給show_action。這在前面提到的Rails指南的nested resources部分中有進一步解釋。通常情況下,您可以使用:shallow => true選項,因爲鏈接標識2已經是唯一的,並且不需要嵌套在公司之下。嵌套路線的實際值顯示了所有與/companies/1/links的鏈接以及所有其他操作直接轉到單個鏈接/links/2

+0

正如我試圖避免包括ids作爲這些鏈接的一部分,這聽起來像我試圖做的事情本質上不是RESTful。我現在正在處理這個問題,我會盡快與您取得進展。感謝您提供如此有用和詳細的回覆。 – sscirrus 2010-06-24 22:37:59