2011-10-09 3 views
24

私はRuby Sinatraアプリを持っていますが、いくつかの例外を除いてすべてのルートで実行する必要があるコードがあります。これはどうすればいいですか?Sinatraいくつかを除くすべてのルートに一致する "before"フィルタを作成する方法

私は選択されたルート(ホワイトリスト形式)のコードを実行したい場合は、私はこれを行うだろう:

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

が、私はそれ他の方法ラウンド(ブラックリストスタイル)しかし、どのように行うのですか?私は'/join''/join/*''/payment/*'

答えて

32

を使用することができ、あなたの正規表現を構築し、テストする

before do 
    pass if %w[join payment].include? request.path_info.split('/')[1] 
    # ... 
end 

それとも、custom matcherを作成することができます。

+0

このパス文にはどのようにルートパス( '/')を含めることができますか? –

+1

['join'、 'payment'、nil] .include? request.path_info.split( '/')[1] –

1

を除くすべてのルートをマッチさせたいあなたは、たとえばシナトラ

にルーティングするための正規表現を使用することができます。

hereから取ら
get %r{/hello/([\w]+)} do |c| 
    "Hello, #{c}!" 
end 

。そこに詳しい情報があります。 pass

before /^(?!\/(join|payment))/ do 
    # ... 
end 

を:あなたは否定先読みでhttp://rubular.com/

+0

参照をリダイレクトループを作成していないリダイレクトとフィルタの前にするために許可され、それは、ドキュメントを読んでから、すでに明らかです。ドキュメント(Sinatra:README)から明らかでないことは、* before filters *が正規表現パターンを取ることができるかどうかです。フィルタ*が前後にどのようにリンクしている記事のまったく別のセクションにあるか気づくでしょう。だからあなたの答えは価値がない(おそらく最後のリンクを除いて)、単に文書がすでに述べていることを繰り返すだけです。従って私のdownvote。 – 0xC0000022L

2

"before all、except ..."フィルタはスプラットを使用し、スプラット条件でコードを実行します。

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

これは私が

+0

ではありません:splat配列ですか? – 0xSina

関連する問題