我有一个有趣的路由情况,我遇到了一些麻烦......这是针对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的路由,我正在撞墙。
答案 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/}
然后你不必担心路由器上的正则表达式匹配,而是可以在控制器中进行。