[英]User-defined routing
我有三個相關的模型:公司,項目和鏈接,並且我試圖創建一個系統,在該系統中我們根據它們創建的鏈接生成路線,例如:
www.site.com/the_company's_specific_path/one_of_company's_links
一家公司has_many:projects,一個項目has_many:links。
結構摘要:
#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
如何設置此系統,以便:
@company = Company.find_by_path(params[:path])
) @link = Link.find_by_link_and_company_id(params[:link],@company.id)
) 如果上述原因不清楚,我們深表歉意。 我已經盡力解釋了! 謝謝。
您應該查看用於RESTful路由的ActionController :: Routing , ActionController :: Resources文檔,以及有關該主題的便捷Rails指南 。 關於路線,也有許多Railscasts。
諸如map.connect :path/:link, :controller => :companies
這樣簡單的方法就可以使用,但是根據您現有的路由,它可能會導致一些問題,並且不是RESTful的。 如果它不會引起任何沖突,那么這將使您可以執行所要求的操作。
您可以使用:requirements選項將約束添加到路由,以縮小被認為是匹配項的范圍:
map.company_link :company/:link, :requirements => { :company => /[\w\-]+/, :link => /[\w\-]+/ }
這只會匹配網址中的單詞和破折號('-')字符,我相信默認路由仍將正常工作。 我還使用map.company_link
將其命名為路線,因此Rails創建了一組URL幫助器,可輕松引用您的路線: company_link_path(:company => "Bechtel", :link => "railwayproject")
如果您要堅持使用REST的方式,那就是:
map.resource :companies do |company|
company.resources :links
end
/companies/1/links/2
將被傳遞給使用公司和鏈接ID作為參數的links_controller的show動作。 前面提到的《 Rails指南》的“ 嵌套資源”部分對此做了進一步說明。 通常,您將使用:shallow => true選項,因為鏈接ID 2已經是唯一的,並且不需要嵌套在公司下。 嵌套路由的真正價值在於顯示所有帶有/companies/1/links
以及所有直接進入各個鏈接/links/2
其他動作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.