【问题标题】:Ruby on Rails: Routing for a tree hierarchy of placesRuby on Rails:位置树层次结构的路由
【发布时间】:2009-12-03 05:11:55
【问题描述】:

所以我们有一个遗留系统来跟踪 ID 为“Europe/France/Paris”的地方,我正在构建一个 Rails 外观以将其转换为 http://foobar/places/Europe/France 之类的 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 覆盖“地点”之后的所有内容?

【问题讨论】:

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


    【解决方案1】:

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

    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”(您可能必须手动重新插入前导斜杠。

    这应该能让你继续前进。

    【讨论】:

    • 太棒了,几乎可以!唯一的问题是内容现在总是呈现为 HTML,即使我尝试使用“.xml”后缀强制它?我正在使用标准的 response_to 来做 |format|块。
    • 看起来带有 :format 支持的路由通配是一个已知问题——也就是说,它不起作用,正如您所发现的那样。错误/补丁在这里讨论:bit.ly/5LICLH 但它看起来不在当前版本的 Rails 中。由于您无法控制 URL 部分(路由),因此我能想到的最好方法是添加一个查询字符串参数(?format=xml 或 ?format=json),您可以在控制器中检测到该参数并采取相应措施。否则,看起来你是 SOL
    【解决方案2】:

    我稍微调整了上面 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 等帮助程序。

    现在,第 2 行 应该 可以工作,但不是因为上面的错误,所以这里是 places_controller.rb 的解决方法,它手动拆分 ID 并设置格式,默认为 XML:

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

    【讨论】:

    • 从最后一个路径组件中获取格式很好。这应该可以解决问题!
    • 后来我意识到 id 也可能包含点,所以使用 .split(/\.(html|xml)$/) 更安全。
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-08
    • 2018-12-28
    相关资源
    最近更新 更多