在Sinatra你如何制作一个匹配所有路线的“之前”过滤器,除了一些

时间:2011-10-09 13:48:11

标签: ruby sinatra

我有一个Ruby Sinatra应用程序,我有一些代码需要在所有路由上执行,除了一些例外。我该怎么做?

如果我想在所选路线(白名单样式)上执行代码,我会这样做:

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

我如何反过来(黑名单风格)呢?我想匹配除'/join''/join/*''/payment/*'

之外的所有路线

3 个答案:

答案 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/