3

所以我们有一个遗留系统来跟踪 ID 为“Europe/France/Paris”的地方,我正在构建一个 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 涵盖“地点”之后的所有内容?

4

2 回答 2

6

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

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

特别是“4.9 Route Globbing”部分。

但我认为您真正想要做的是声明您的路线,例如:

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

使用类似的 URL 调用

/places/foo/bar/1

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

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

那应该让你继续前进。

于 2009-12-03T05:27:26.313 回答
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:

id, suffix = params[:id].join('/').split('.') 
params[:format] = suffix ? suffix : "xml"
于 2009-12-03T23:31:49.830 回答