[英]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_url
, place_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.