0

我正在使用 Sinatra,我想在我的 url 中使用类似引用代码之类的东西,这将在一定程度上控制访问并识别给定 URL 的出处。

/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])
4

2 回答 2

1

从事物的声音来看,您似乎正在尝试使用 Sinatra 的命名参数。参数仅在块内的范围内:

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

上面的代码假设您有一组“secret_codes”,您将使用 URL 中的 secret_code 进行检查。

于 2013-10-22T20:41:21.427 回答
0

(回答我自己的问题)

Sinatra 匹配词法上的第一个规则,您可以使用“pass”传递到下一个匹配规则。所以只要它是第一个匹配的规则,这样的东西就可以工作。

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

get '/:tag/route1' do
   'hello world'
end
于 2013-10-22T21:32:52.867 回答