2

我一直在 Sinatra 中按照文档中声明的方式使用过滤器:没有匹配字符串、匹配字符串或匹配正则表达式。到目前为止,它一直运行良好。现在,我有一个特定的用例。假设我有这条路线:

/resources/1

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

/resources/

这当然是错误的,因为 PUT 请求没有关联的资源 id。我想知道 Sinatra 中是否有一些东西可以让我做这样的事情:

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

只是这种可能性不存在(之前只接受一个论点)。我怎样才能达到这个结果呢?

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 回答