Rest 在Sinatra中,如何使过滤器依赖于请求方法?

Rest 在Sinatra中,如何使过滤器依赖于请求方法?,rest,sinatra,Rest,Sinatra,我在Sinatra中使用了文档中声明的过滤器:没有匹配字符串、匹配字符串或匹配regexp。到目前为止,它一直运转良好。现在,我有一个特殊的用例。假设我有一条路线: /resources/1 根据REST,根据请求方法的不同,这可以是GET方法、PUT方法或DELETE方法。第一个问题是:如何编写只在GET请求时调用的过滤器?(目前我让所有的方法都被过滤,然后我才测试这个方法。它是有效的,但我不喜欢它)。第二个问题,也是更重要的一个问题:假设这样的PUT请求被触发: /resources/

我在Sinatra中使用了文档中声明的过滤器:没有匹配字符串、匹配字符串或匹配regexp。到目前为止,它一直运转良好。现在,我有一个特殊的用例。假设我有一条路线:

/resources/1
根据REST,根据请求方法的不同,这可以是GET方法、PUT方法或DELETE方法。第一个问题是:如何编写只在GET请求时调用的过滤器?(目前我让所有的方法都被过滤,然后我才测试这个方法。它是有效的,但我不喜欢它)。第二个问题,也是更重要的一个问题:假设这样的PUT请求被触发:

/resources/
这当然是错误的,因为PUT请求没有关联的资源id。我想知道西纳特拉是否有什么东西能让我做这样的事情:

before "/resources/", :method => :put do
  error_message
end
只是这种可能性不存在(在只接受一个参数之前)。我怎样才能达到最好的效果呢?

实际上,是过滤器。不过,您不必使用条件,您可以在筛选器中使用条件:

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

有关详细信息,请参阅。

很抱歉,答复太晚。我实际上使用了你的建议,但没有定义诸如get?、post?等helpers方法。。。但它基本上进入了request_方法var。