Ruby 在西纳特拉,你如何制作一个;“之前”;匹配除某些路由之外的所有路由的筛选器
我有一个Ruby Sinatra应用程序,我有一些代码需要在所有路由上执行,除了少数例外。我该怎么做 如果我想在所选路由(白名单样式)上执行代码,我会这样做:Ruby 在西纳特拉,你如何制作一个;“之前”;匹配除某些路由之外的所有路由的筛选器,ruby,sinatra,Ruby,Sinatra,我有一个Ruby Sinatra应用程序,我有一些代码需要在所有路由上执行,除了少数例外。我该怎么做 如果我想在所选路由(白名单样式)上执行代码,我会这样做: ['/join', "/join/*", "/payment/*"].each do |path| before path do #some code end end 但我该如何反过来做(黑名单风格)?我想匹配除'/join'、'/join/*'和'/payment/*'之外的所有路由。您可以在sinat
['/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过滤器是否也可以采用正则表达式模式。您将注意到,在链接到的文章中,前后过滤器位于完全不同的部分。因此,您的答案没有增加任何价值(除了最后一个链接),只是重复文档中已经说明的内容。因此,我投了反对票。