【问题标题】:In Sinatra, how to make filters dependent of request method?在 Sinatra 中,如何使过滤器依赖于请求方法?
【发布时间】:2012-09-03 11:37:32
【问题描述】:

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

/resources/1

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

/resources/

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

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

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

【问题讨论】:

    标签: rest sinatra


    【解决方案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 了解更多信息。

    【讨论】:

    • 抱歉回复晚了。我实际上使用了您的建议,但没有定义诸如 get?、post? 等辅助方法......但它基本上确实进入了 request_method var。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多