web-dev-qa-db-fra.com

à Sinatra, comment faites-vous un filtre "avant" qui correspond à tous les itinéraires sauf certains

J'ai une application Ruby SINATRA et j'ai un code que j'ai besoin d'exécuter sur toutes les itinéraires, sauf à quelques exceptions près. Comment puis-je faire cela?

Si je voulais exécuter le code sur des itinéraires sélectionnés (style whitelist), je ferais ceci:

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

Comment puis-je le faire dans l'autre sens (style noirliste)? Je veux correspondre à tous les itinéraires sauf '/join', '/join/*' Et '/payment/*'

32
lms

Avec un look négatif:

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

Avec pass:

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

Ou vous pouvez créer un correspondeur personnalisé .

38
Konstantin Haase

Ce que j'ai fait pour faire un "avant tout, sauf ...", le filtre utilise une splat, puis exécutez un code sur des conditions de splat.

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

Cela m'a permis de faire un filtre avant un redirection qui n'a pas créé de boucle de redirection

2
OneChillDude

Vous pouvez utiliser des expressions régulières pour router dans SINATRA

par exemple:

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

pris de - ici . Là, vous pouvez trouver d'autres informations.

pour créer et tester votre regex, vous pouvez utiliser http://rubular.com/

1
ben