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/*'
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é .
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
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/