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_url
, place_path
等助手。
现在,第二行应该可以工作,但不是由于上面的错误,所以这里是places_controller.rb的一种解决方法,它手动拆分ID并设置格式,默认为XML:
id, suffix = params[:id].join('/').split('.') params[:format] = suffix ? suffix : "xml"
- 使用关联(has_many)模型中的字段和rails中的formtastic
- 在循环内调用redis’get’来显示论坛post查看数据
- Capistrano 3资产:预编译需要数小时。 停在css文件
- 如何使用ActionCable作为API
- 如何使用Twitter Bootstrap Rails gem定义Flash通知
- Rails资产管道:如何创建自定义清单文件
- 如何正确使用collection_select以及自定义关联
- Rails 3应用程序中的Sass导入错误 – “导入未找到或无法读取的文件:指南针”
- 在Rails 5.0.0.beta3,-api选项中使用accepts_nested_attributes_for时出现问题