我有一个Ruby Sinatra应用程序,我有一些代码需要在所有路由上执行,除了一些例外。我该怎么做?
如果我想在所选路线(白名单样式)上执行代码,我会这样做:
['/join', "/join/*", "/payment/*"].each do |path|
before path do
#some code
end
end
我如何反过来(黑名单风格)呢?我想匹配除'/join'
,'/join/*'
和'/payment/*'
答案 0 :(得分:38)
负面预测:
before /^(?!\/(join|payment))/ do
# ...
end
使用pass
:
before do
pass if %w[join payment].include? request.path_info.split('/')[1]
# ...
end
或者您可以创建custom matcher。
答案 1 :(得分:2)
我做了什么来制作一个“在所有之前,除了......”过滤器使用splat,然后在splat条件下运行代码。
before '/*' do
unless params[:splat] == 'nofilter' || params[:splat] == 'beta'
redirect '/beta'
end
end
这允许我使用不创建重定向循环的重定向进行前置过滤器
答案 2 :(得分:1)
您可以使用正则表达式在sinatra中进行路由
例如:
get %r{/hello/([\w]+)} do |c|
"Hello, #{c}!"
end
取自here。在那里你可以找到更多的信息。
构建和测试正则表达式,您可以使用http://rubular.com/