如何在Sinatra应用程序中弃用路线?

时间:2015-05-07 16:15:02

标签: ruby sinatra

我正在编写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发送帖子请求,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将第一个匹配的路线作为响应。如何弃用第一个,以便最后一个生效?

1 个答案:

答案 0 :(得分:1)

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

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

所以,也许您需要使用

之类的东西删除路线
remove_method params[:method]

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

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