Sinatra路线的必需和可选参数

Rya*_*anW 5 ruby regex routing routes sinatra

使用Sinatra路由,如何在路径的同一部分中同时存在所需的命名参数和可选的命名参数.

可选路由参数在这里工作正常

get '/widgets.?:format?'
Run Code Online (Sandbox Code Playgroud)

但是,尝试组合一个必需的命名参数,事情就会破裂.

get '/widgets/:id.?:format?'
Run Code Online (Sandbox Code Playgroud)

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

Sinatra编译的正则表达式是:

/^\/widgets\/([^\/?#]+)(?:\.|%2E)?([^\/?#]+)?$/
Run Code Online (Sandbox Code Playgroud)

Rya*_*anW 2

我确实通过在路线上使用完整的正则表达式并排除“.”来解决这个问题。来自第一个正则表达式组。

get %r{/widgets\/([^\/?#\.]+)(?:\.|%2E)?([^\/?#]+)?}
Run Code Online (Sandbox Code Playgroud)