Несколько необязательных параметров на маршруте синатра
Мне нужен маршрут Синатры, чтобы вести себя следующим образом:
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
Я понимаю, я мог бы передать значения в качестве запроса:
GET /list?limit=20&offset=10
но я хочу передать их, как описано выше. Я уверен, что есть способ объяснить Синатре/Падрино, что я хочу сделать, но Im в настоящее время полностью застрял. Я пробовал:
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
Как я могу заметить Sinatra, что параметр может быть необязательным?
Случайно,
get %r{/list(/[^/]+)*} do
# parse params[:captures]
end
работает, но это выглядит глупо.
Этот минимальный пример:
#!/usr/bin/env ruby
require 'sinatra'
get '/test/?:p1?/?:p2?' do
"Hello #{params[:p1]}, #{params[:p2]}"
end
работает только для /test
, /test/a
и /test/a/b
. Я что-то пропустил в вашем вопросе?
Собственно, сопоставление параметров в Sinatra выполняется Mustermann, и в соответствии с документацией у вас есть несколько доступных сокетов.
В синатре у вас есть:
sinatra /:slug(.:ext)?
Итак, если вам нужны дополнительные параметры, вам нужно их обернуть в ()?
, как в примере выше, взятом из документации.