在rails路由的id中有一个点

Sat*_*shi 9 regex routes ruby-on-rails regex-negation

我正在研究Rails 2.3.11.如果我有一个像http://www.abc.com/users/efjson这样的网址,我希望id为'ef',预期格式为'json'.有人可以建议一种方法来做到这一点.谢谢!

and*_*vom 10

由于:格式约定,Rails将解析所有参数而不带任何点.如果需要,您可以使用带点的路径参数:

# You can change the regex to more restrictive patterns
map.connect 'users/:id', :controller => 'users', :action => 'show', :id => /.*/
Run Code Online (Sandbox Code Playgroud)

但由于'*'和'+'正则表达式通配符都是贪婪的,它将完全忽略(.:格式)参数.

现在,如果你绝对需要在用户名中加点,那么有一个伪解决方法可以帮助你:

map.connect 'users/:id:format', :controller => 'users', :action => 'show', :requirements => { :format => /\.[^.]+/, :id => /.*/ }
map.connect 'users/:id', :controller => 'users', :action => 'show'
Run Code Online (Sandbox Code Playgroud)

缺点是你必须在:格式正则表达式中包含点,否则它将被用户名表达式捕获.然后你必须在控制器中处理虚线格式(例如:.json).