Ruby 在西纳特拉,你如何制作一个;“之前”;匹配除某些路由之外的所有路由的筛选器

Ruby 在西纳特拉,你如何制作一个;“之前”;匹配除某些路由之外的所有路由的筛选器,ruby,sinatra,Ruby,Sinatra,我有一个Ruby Sinatra应用程序,我有一些代码需要在所有路由上执行,除了少数例外。我该怎么做 如果我想在所选路由(白名单样式)上执行代码,我会这样做: ['/join', "/join/*", "/payment/*"].each do |path| before path do #some code end end 但我该如何反过来做(黑名单风格)?我想匹配除'/join'、'/join/*'和'/payment/*'之外的所有路由。您可以在sinat

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

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

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

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

之外的所有路由。您可以在sinatra中使用正则表达式进行路由

例如:

get %r{/hello/([\w]+)} do |c|
   "Hello, #{c}!"
end
摘自。在那里你可以找到更多的信息


要构建和测试正则表达式,您可以使用带有负前瞻性的

before /^(?!\/(join|payment))/ do
  # ...
end
使用<代码>通过<代码>:

 before do
   pass if %w[join payment].include? request.path_info.split('/')[1]
   # ...
 end
或者您可以创建一个。

我所做的是使用一个splat,然后在splat条件下运行代码

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

这使我能够使用未创建重定向循环的重定向创建一个before筛选器

如何在此pass语句中包含根路径(“/”)?如果['join','payment',nil],则传递。包含吗?request.path_info.split(“/”)[1]通行证对我来说很有效,但负面展望却不行。两个问题:1)Sinatra(至少1.4.6)在正则表达式中有一个“^”字符的解析错误,2)负前瞻语法只检查转义的正斜杠。不允许使用可变宽度值。看,从阅读文档中已经很清楚了。文档(Sinatra:README)中不清楚的是before过滤器是否也可以采用正则表达式模式。您将注意到,在链接到的文章中,前后过滤器位于完全不同的部分。因此,您的答案没有增加任何价值(除了最后一个链接),只是重复文档中已经说明的内容。因此,我投了反对票。