【问题标题】:How can I deprecate a route in a Sinatra app?如何在 Sinatra 应用程序中弃用路线?
【发布时间】:2015-05-07 16:15:01
【问题描述】:

我正在用 Sinatra 编写一个 API 模拟服务器,如下所示

require 'sinatra/base'

class APIMockServer < Sinatra::Base

  post '/mock' do
    _body = params[:body]
    _status = params[:status] || 200
    APIMockServer.send params[:method], params[:action] do
      body _body
      status _status
    end
    'success'
  end

  run! if app_file == $0

end

我向/mock发送post请求,Sinatra App会动态生成路由。

require 'restclient'

RestClient.post(
    '127.0.0.1:4567/mock',
    {
        action: '/sayhi',
        method: 'get',
        body: 'hello world'
    }
)

到目前为止,它按预期工作,但是当我发送另一个具有相同action 的帖子请求时,它不会生效。

require 'restclient'

RestClient.post(
    '127.0.0.1:4567/mock',
    {
        action: '/sayhi',
        method: 'get',
        body: 'hello world, hello Sinatra' # the body is changing
    }
)

我猜是因为我定义了两条同名的路由,所以 Sinatra 采用第一个匹配的路由来响应。如何弃用第一个,以便最后一个生效?

【问题讨论】:

  • 我只看到这里定义了一条路线。第二条路线出现在哪里?
  • 由APIMockServer.send params[:method], params[:action]定义,在本例中等于get('/sayhi') { 'hello world' }。
  • 这是一种奇怪的做法。您可能需要为您的服务器设置“记录”模式,以及稍后可以使用的“回放”。这样可以避免这里的冲突。这是VCR使用的模型。
  • 感谢您的重播,我会考虑您推荐的宝石。但如果我的问题得到解决,我会感觉更好 =)

标签: ruby sinatra


【解决方案1】:

这是一个有趣的应用程序。这是一个元编程 API。

我认为问题在于,一旦定义了路线,它就不会被重新定义。

所以,也许您需要使用类似的方法删除路线

remove_method params[:method]

或

APIMockServer.remove_method params[:method], params[:action]

我不确定 Sinatra 如何管理已定义的路线,但您可能想了解一下。或许How do you remove a route from Sinatra? 会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2013-01-03
    • 2012-07-14
    • 2012-12-06
    • 2012-11-27
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多