2014-02-18 6 views
7

мне нужен маршрут Синатры вести себя следующим образом:несколько необязательных параметров в Синатра маршруте

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 

, но я хочу передайте их, как описано выше. Я уверен, что есть способ объяснить Синатре/Падрино, что я хочу сделать, но в настоящее время я полностью застрял. Я пробовал:

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 

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

+0

Попробуйте следующее: http://stackoverflow.com/a/14885171/1120015 –

+0

@UriAgassi Это то же самое, что и grepping 'regex', я ищу более четкие и прямые пути. – mudasobwa

+1

Я думал, что 'get '/ comments /: start /? do | start = 0 | 'делает трюк для вас ... –

ответ

17

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

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

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

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

+0

Ooups ... Теперь это работает для меня как шарм. Похоже, что ошибка была вызвана. Спасибо, в любом случае. – mudasobwa

+0

Вам нужны два? окружать каждый дополнительный именованный параметр? – Jwan622

+0

Да, документация очень скудна относительно необязательных параметров, но именно так они определены. Использование вопросительного знака было, может быть, неудобным решением, поскольку это может привести к путанице с тем, который используется для строки запроса. –

2

Фактически параметры, соответствующие в Sinatra, выполняются Mustermann, и в соответствии с документацией у вас есть несколько доступных штекеров.

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

sinatra  /:slug(.:ext)? 

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

Смежные вопросы