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

所以我们有一个遗留系统跟踪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"