2012-03-19 110 views
5

使用Sinatra路由时,如何在路由的相同部分同时存在所需的命名参数和可选的命名参数。Sinatra路由的必需参数和可选参数

可选路径参数工作正常这里

get '/widgets.?:format?' 

但是,尝试将需要命名放慢参数结合起来,事情打破。

get '/widgets/:id.?:format?' 

请求/widgets/abc.json传递整个abc.json作为id参数。

的西纳特拉编译正则表达式是:“”

/^\/widgets\/([^\/?#]+)(?:\.|%2E)?([^\/?#]+)?$/ 
+1

这是因为用于匹配':id'的正则表达式很贪婪,但是向其余的添加'?'使得它们不合格。请打开[问题](https://github.com/sinatra/sinatra/issues/new),我可能会解决这个问题。 – 2012-03-21 14:48:27

回答

2

我没有突破这个由去的路线上全面的正则表达式和排除来自第一个正则表达式组。

get %r{/widgets\/([^\/?#\.]+)(?:\.|%2E)?([^\/?#]+)?} 
+0

您是否也按@Konstantin要求提出了问题?之前我遇到过这样的问题(虽然实际上并不在Sinatra中),并且很高兴知道它已在Sinatra中得到修复。 – iconoclast 2014-10-04 15:23:36