簡體   English   中英

Ruby on Rails:路由樹的層次結構

[英]Ruby on Rails: Routing for a tree hierarchy of places

所以我們有一個遺留系統跟蹤ID為“歐洲/法國/巴黎”的地方,我正在構建一個Rails外觀,將其轉換為http:// foobar / places / Europe / France / Paris等URL。 這個要求是不可協商的,可能的級別數量無限制,而且我們無法逃避斜線。

http:// foobar / places / Europe設置routes.rb是微不足道的:

map.resources :places

...但是http:// foobar / places / Europe / France抱怨“沒有行動回應歐洲”。 我試過了:

map.connect '/places/:id', :controller => 'places', :action => 'show' 

...但是這給出了相同的結果,顯然:id結束於第一個'/'。 如何使ID覆蓋“地點”之后的任何內容和所有內容?

有關完整文檔,請查看路由指南:

http://guides.rubyonrails.org/routing.html

特別是“4.9路線全球化”部分。

但我認為你真正想要做的就是聲明你的路線:

map.connect '/places/*id', :controller => 'places', :action => 'index'

用URL來調用

/places/foo/bar/1

Yields a params[:id] => ["foo", "bar", "1"]

您可以輕松地(重新)加入“/”以產生您想要的完整字符串“foo / bar / 1”(您可能需要手動重新插入前導斜杠。

這應該讓你去。

我稍微調整了Cody的答案以得出這個:

map.place '/places/*id', :controller => 'places', :action => 'show'
map.connect '/places/*id.:format', :controller => 'places', :action => 'show'

通過使用map.place而不是map.connect,Rails知道我們正在處理什么資源並正確生成place_urlplace_path等助手。

現在,第二行應該可以工作,但不是由於上面的錯誤,所以這里是places_controller.rb的一種解決方法,它手動拆分ID並設置格式,默認為XML:

id, suffix = params[:id].join('/').split('.') 
params[:format] = suffix ? suffix : "xml"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM