如何基于sinatra中的url参数进行路由?

时间:2013-10-22 20:03:07

标签: ruby sinatra

我正在使用Sinatra,我希望在我的网址中使用类似引荐代码的内容,这些代码会在某种程度上控制访问并识别给定网址的来源。

/secret-code/rest/of/path
如果“密码”不在预定列表中,则应拒绝

我想使用路线条件

set(:valid_tag) { |tag| condition { tag === 'abcd' } }

get '/:tag', :valid_tag => params[:tag] do 
  'Hello world!'
end

但是params不在范围内。我需要在街区派遣吗?处理多个路由而不必在每个路由中复制标记检查逻辑的最佳方法是什么?

/secret/route1/
/secret/route1/blah
/secret/route2/

有链接处理程序的方法吗?我可以吗

 get /:tag/*
      # check :tag
      redirect_to_handler(params[:splat])

2 个答案:

答案 0 :(得分:1)

根据事物的声音,您似乎正在尝试使用Sinatra的命名参数。参数只在区块范围内:

get '/:secret_code/*' do
    redirect_to_handler unless secret_codes.include? params[:secret_code]
end

上面的代码假设您有一组' secret_codes'您将使用网址中的secret_code进行检查。

答案 1 :(得分:0)

(回答我自己的问题)

Sinatra匹配词法第一规则,您可以使用'pass'传递下一个匹配规则。所以这样的事情就可以了,只要它是第一个匹配的规则。

get '/:tag/*' do
  halt_if_bad_tag params[:tag]
  pass
end

get '/:tag/route1' do
   'hello world'
end