我一直在使用Sinatra中的过滤器,就像在文档中声明它一样:没有匹配字符串,匹配字符串或匹配正则表达式。它一直运作良好,直到现在。现在,我有一个特定的用例。假设我有这条路线:
/resources/1
根据REST,根据请求方法,这可以是GET方法,PUT方法或DELETE方法。第一个问题是:如何编写仅在GET请求时调用的过滤器? (目前我让它们全部被过滤掉,然后我才测试方法。它有效,但我不喜欢它)。第二个问题,更重要的是:让我们说这样的PUT请求被触发:
/resources/
这当然是错误的,因为PUT请求没有关联的资源ID。我想知道Sinatra中是否有某些东西可以让我做这样的事情:
before "/resources/", :method => :put do
error_message
end
只是这种可能性不存在(之前只接受一个参数)。我怎么能最好地达到这个结果?
答案 0 :(得分:1)
实际上,过滤do take conditions。您不必使用条件,您可以在过滤器中使用条件:
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
有关详情,请参阅conditions。