Rails路由碰撞处理

时间:2012-04-20 13:58:17

标签: ruby-on-rails ruby routing seo

我有一个有趣的路由情况,我遇到了一些麻烦......这是针对rails 2.3应用程序,这是场景:

route a:
/:trans_type/:country_code/:property_types

route b:
/:trans_type/:country_code/:location

这两条路线共享路线中的相同位置,因此需要设置:要求设置:location或:property_types以区分两者。

因为:location非常开放,:property_types是要走的路,因为我有一个模块,可以轻松编译所有现有属性类型的列表,以进行正则表达式匹配。

问题: /出售/ US /公寓阁楼

因为:property_types是一个数组,我必须解析params对象中的多个property_types(显然是在路由器之外)。如果我有这样的情况,我就不可能在路由器中针对已知的属性类型进行正则表达式匹配,因为:property_types可能会返回多个带连字符的类型。

我的问题是,我是否可以使用:property_types字符串并专门针对:requirements matching进行修改?如果我可以将'公寓 - 阁楼'替换为该公开赛的'公寓'(/ ^ \ w + /),那么我就可以实际上正则匹配。

Here's what the two routes actually look like:

map.location ":transaction/:country_code/:property_types",
  :controller => "search",
  :action => "location",
  :requirements => { :transaction => /(for-sale|for-rent|auction|new_development)/, :country_code => /\w\w/, :property_types => /(#{prop_types})/ }

map.location ":transaction/:country_code/:location",
  :controller => "search",
  :action => "location",
  :requirements => { :transaction => /(for-sale|for-rent|auction|new_development)/, :country_code => /\w\w/}

上述实现适用于具有一个property_type的路由,但对于具有多个带连字符的property_types的路由,我正在撞墙。

1 个答案:

答案 0 :(得分:1)

如果可行,我建议为这两种情况创建显式路由和控制器操作:

map.location ":transaction/:country_code/property-types/:property_types",
  :controller => "search",
  :action => "by_property_type",
  :requirements => { :transaction => /(for-sale|for-rent|auction|new_development)/, :country_code => /\w\w/, :property_types => /(#{prop_types})/ }

map.location ":transaction/:country_code/:location",
  :controller => "search",
  :action => "by_location",
  :requirements => { :transaction => /(for-sale|for-rent|auction|new_development)/, :country_code => /\w\w/}

然后你不必担心路由器上的正则表达式匹配,而是可以在控制器中进行。