2012-03-19 11 views
5

Con las rutas Sinatra, ¿cómo puede haber un parámetro nombrado requerido y un parámetro nombrado opcional en la misma parte de la ruta?Parámetros necesarios y opcionales para la ruta Sinatra

parámetro de ruta opcional funciona bien aquí

get '/widgets.?:format?' 

Pero, trata de combinar un parametro llamado requerida, y las cosas se rompen.

get '/widgets/:id.?:format?' 

solicitudes de /widgets/abc.json pasan todo el abc.json como el parámetro id.

El Sinatra expresión regular compilada es: ""

/^\/widgets\/([^\/?#]+)(?:\.|%2E)?([^\/?#]+)?$/ 
+1

Esto se debe a que la expresión regular para hacer coincidir ': id' es codiciosa, pero agregar'? 'Al resto hace que no estén codificadas. Abra [un problema] (https://github.com/sinatra/sinatra/issues/new), podría solucionarlo. –

Respuesta

2

Me hizo llegar más allá de este yendo expresión regular completa sobre la ruta y excluyendo el del primer grupo regex

get %r{/widgets\/([^\/?#\.]+)(?:\.|%2E)?([^\/?#]+)?} 
+0

¿También abriste un problema como se solicitó @ Konstantin? Me encontré con este tipo de problema antes (aunque no en realidad en Sinatra) y sería bueno saber que se ha solucionado en Sinatra. – iconoclast

Cuestiones relacionadas