所以我们有一个遗留系统跟踪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覆盖“地点”之后的任何内容和所有内容?
答案 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_url
,place_path
等助手。
现在,第二行应该工作,但不是由于上面的错误,所以这里是places_controller.rb的一种解决方法,它手动拆分ID并设置格式,默认为XML:< / p>
id, suffix = params[:id].join('/').split('.')
params[:format] = suffix ? suffix : "xml"