sinatra路线中的几个可选参数

Ale*_*kin 9 ruby sinatra padrino

我需要Sinatra路由以下列方式运行:

GET /list/20/10  # Get 20 items with offset 10
GET /list/20     # Get 20 items with default offset
GET /list        # Get default number of items with default offset
Run Code Online (Sandbox Code Playgroud)

我明白,我可能会将值作为查询传递:

GET /list?limit=20&offset=10
Run Code Online (Sandbox Code Playgroud)

但我想按照上面的描述传递它们.我很确定有一种方法可以向Sinatra/Padrino解释我想做什么,但我现在完全陷入困境.我试过了:

get :list, :map => '/list', :with => [:limit, :offset] {} # 404 on /list
get :list, :map => '/list/*' { puts params[:splat] } # 404 on /list
get :list, :map => '/list/?:limit?/?:offset?' {} # 404 on /list
get :list, :map => '/list' { redirect url_for(:list, …) } # 302, not convenient for consumers
Run Code Online (Sandbox Code Playgroud)

我怎么能注意到Sinatra参数可能是可选的?

偶然,

get %r{/list(/[^/]+)*} do
  # parse params[:captures]
end
Run Code Online (Sandbox Code Playgroud)

有效,但看起来很傻.

To마*_*마SE 19

这个最小的例子:

#!/usr/bin/env ruby
require 'sinatra'

get '/test/?:p1?/?:p2?' do
  "Hello #{params[:p1]}, #{params[:p2]}"
end
Run Code Online (Sandbox Code Playgroud)

只适用于/test,/test/a/test/a/b.我错过了你的问题吗?

  • 可选参数不需要两个问号.问号表示前面的字符或参数是可选的.在这种情况下,它显示斜杠是可选的,并且该参数是可选的. (5认同)