web-dev-qa-db-ja.com

シナトラでは、一部を除くすべてのルートに一致する「前」フィルターをどのように作成しますか

Ruby Sinatraアプリがあり、いくつかの例外を除くすべてのルートで実行する必要があるコードがあります。これを行うにはどうすればよいですか?

選択したルート(ホワイトリストスタイル)でコードを実行したい場合は、次のようにします。

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

逆にどうやってそれを行うのですか(ブラックリストスタイル)? '/join''/join/*''/payment/*'を除くすべてのルートを照合したい

32
lms

否定先読みあり:

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

passの場合:

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

または、 カスタムマッチャー を作成することもできます。

38

「すべてを除いて...」フィルターを作成するために私がしたことは、スプラットを使用し、スプラット条件でコードを実行することです。

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

これにより、リダイレクトループを作成しないリダイレクトでbeforeフィルターを作成できました

2
OneChillDude

シナトラでのルーティングに正規表現を使用できます

例えば:

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

here から取得。そこには、さらに詳しい情報があります。

正規表現をビルドしてテストするには、次のように使用できます http://rubular.com/

1
ben