在Sinatra中,如何根据请求方法制作过滤器?

时间:2012-09-03 11:37:32

标签: rest sinatra

我一直在使用Sinatra中的过滤器,就像在文档中声明它一样:没有匹配字符串,匹配字符串或匹配正则表达式。它一直运作良好,直到现在。现在,我有一个特定的用例。假设我有这条路线:

/resources/1

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

/resources/

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

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

只是这种可能性不存在(之前只接受一个参数)。我怎么能最好地达到这个结果?

1 个答案:

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

相关问题