Ruby on Rails:路由树的层次结构

时间:2009-12-03 05:11:55

标签: ruby-on-rails routing hierarchy hierarchical-trees

所以我们有一个遗留系统跟踪ID为“欧洲/法国/巴黎”的地方,我正在构建一个Rails外观,将其转换为http:// foobar / places / Europe / France等网址/巴黎。这个要求是不可协商的,可能的级别数量无限制,我们无法逃避斜线。

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

map.resources :places

...但http:// foobar / places / Europe / France抱怨“没有行动回应欧洲”。我试过了:

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

...但是这给出了相同的结果,因为显然:id在第一个'/'结束。如何使ID覆盖“地点”之后的任何内容和所有内容?

2 个答案:

答案 0 :(得分:6)

请查看路由指南以获取完整文档:

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

特别是“4.9路线全球化”一节。

但我认为你真正想做的就是声明你的路线:

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

使用类似

的网址调用
/places/foo/bar/1

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

您可以轻松(重新)加入“/”以产生您想要的完整字符串“foo / bar / 1”(您可能需要手动重新插入前导斜杠。

这应该让你去。

答案 1 :(得分:0)

我稍微调整了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:< / p>

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