2011-10-09 15 views
24

Tengo una aplicación Ruby Sinatra y tengo un código que debo ejecutar en todas las rutas, excepto por unas pocas excepciones. ¿Cómo hago esto?en Sinatra, ¿cómo se hace un filtro "anterior" que coincida con todas las rutas excepto algunas

Si quería ejecutar el código en rutas seleccionadas (estilo de lista blanca) me gustaría hacer esto:

['/join', "/join/*", "/payment/*"].each do |path| 
    before path do 
     #some code 
    end 
end 

Cómo lo hago al revés, aunque (el estilo de lista negra)? Quiero hacer coincidir todas las rutas excepto '/join', '/join/*' y '/payment/*'

Respuesta

32

Con negativo de preanálisis:

before /^(?!\/(join|payment))/ do 
    # ... 
end 

Con pass:

before do 
    pass if %w[join payment].include? request.path_info.split('/')[1] 
    # ... 
end 

O puede crear un custom matcher.

+0

¿cómo puedo incluir la ruta raíz ('/') en esta declaración de pase? –

+1

pase si ['join', 'payment', nil] .include? request.path_info.split ('/') [1] –

1

Puede utilizar expresiones regulares para el encaminamiento de Sinatra

por ejemplo:

get %r{/hello/([\w]+)} do |c| 
    "Hello, #{c}!" 
end 

tomado de here. allí puedes encontrar más información.

para construir y probar su expresión regular puede utilizar http://rubular.com/

+0

Sede, que ya está claro a partir de la lectura de los documentos. Lo que no está claro en los documentos (Sinatra: README) es si * before filters * también puede tomar patrones regex. Notará cómo * los filtros antes y después * se encuentran en una sección completamente diferente del artículo al que se vinculó. Por lo tanto, su respuesta no agrega ningún valor (excepto tal vez el último enlace) y simplemente repite lo que los documentos ya indican. Por lo tanto mi downvote. – 0xC0000022L

2

Lo que hice para crear un filtro "antes de todo, excepto ..." es usar un splat y luego ejecutar el código en condiciones de splat.

before '/*' do 
    unless params[:splat] == 'nofilter' || params[:splat] == 'beta' 
    redirect '/beta' 
    end 
end 

Esto me ha permitido realizar un antes filtro con una redirección que no crear un bucle de redireccionamiento

+0

no es: splat a array? – 0xSina

Cuestiones relacionadas