Несколько необязательных параметров на маршруте синатра

121
13

Мне нужен маршрут Синатры, чтобы вести себя следующим образом:


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

работает, но это выглядит глупо.

спросил(а) 2014-02-18T10:39:00+04:00 7 лет назад
1
Решение
180

Этот минимальный пример:


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

get '/test/?:p1?/?:p2?' do
"Hello #{params[:p1]}, #{params[:p2]}"
end

работает только для /test, /test/a и /test/a/b. Я что-то пропустил в вашем вопросе?

ответил(а) 2014-02-18T15:00:00+04:00 7 лет назад
74

Собственно, сопоставление параметров в Sinatra выполняется Mustermann, и в соответствии с документацией у вас есть несколько доступных сокетов.


В синатре у вас есть:

sinatra     /:slug(.:ext)?

Итак, если вам нужны дополнительные параметры, вам нужно их обернуть в ()?, как в примере выше, взятом из документации.

ответил(а) 2017-01-06T17:23:00+03:00 4 года, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема