0

私は Sinatra を使用しており、URL にリファラー コードのようなものを使用して、アクセスを制御し、特定の URL の出所を特定したいと考えています。

/secret-code/rest/of/path

「secret-code」が所定のリストにない場合は拒否する必要があります。

ルート条件を使いたい

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 の名前付きパラメーターを利用しようとしているように見えます。Params はブロック内でのみ有効です:

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

上記のコードは、URL の secret_code で確認する「secret_codes」のコレクションがあることを前提としています。

于 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 に答える