2

ドキュメントで宣言されている方法で Sinatra でフィルターを使用してきました: 一致文字列なし、一致文字列あり、または一致正規表現あり。それは今までうまくいっています。今、私は特定のユースケースを持っています。このルートがあるとしましょう:

/resources/1

REST によると、リクエスト メソッドに応じて、これは GET メソッド、PUT メソッド、または DELETE メソッドのいずれかになります。最初の質問: GET 要求の場合にのみ呼び出されるフィルターを作成する方法は? (現在、私はそれらすべてをフィルタリングしてから、メソッドをテストしています。動作しますが、好きではありません)。2 番目の質問で、さらに重要です。たとえば、次のような PUT リクエストがトリガーされたとします。

/resources/

PUT リクエストにはリソース ID が関連付けられていないため、これはもちろん間違っています。Sinatra に次のようなことを可能にする何かがあるかどうか知りたいです。

before "/resources/", :method => :put do
  error_message
end

この可能性は存在しません (引数を 1 つだけ受け入れる前)。せいぜいこの結果を達成するにはどうすればよいですか?

4

1 に答える 1

1

実際には、フィルタは条件を取ります。ただし、条件を使用する必要はありません。フィルター内で条件を使用できます。

before "/path/" do
  if request.request_method == "PUT"
    # do something
  end
end

条件を使用したい場合は、おそらく次のように書く必要があると思います。

set(:accepted_verbs) {|*verbs|
  condition { 
    verbs.any?{|v| v == request.request_method }
  } 
}

before "/path/", :accepted_verbs => ["GET","POST"] do
  # do something
end

before "/path/", :accepted_verbs => ["PUT"] do
  # do something else
end

詳しくは条件をご覧ください。

于 2012-09-19T02:15:38.633 に答える