你如何从Sinatra中删除路线?

时间:2011-11-21 13:44:26

标签: ruby routing sinatra

我有一些动态加载的插件,它们在启动时注册它们的路由,但是我还需要能够在它们被禁用时删除它们的路由。有没有办法删除现有路线?

API没有任何方法可以删除它们,而我能想到的另一种方法就是直接进入Sinatra :: Base中的@routes对象,但我不确定如果你可以做任何事情,如果可以......这样做是否安全?

3 个答案:

答案 0 :(得分:3)

查看代码几分钟,我没有看到任何代码“破坏性地”改变routes以外的代码:

C:\Ruby\lib\ruby\gems\1.9.1\gems\sinatra-1.3.1\lib\sinatra\base.rb:
  936        def reset!
  937          @conditions     = []
  938:         @routes         = {}
  939          @filters        = {:before => [], :after => []}
  940          @errors         = {}

这是一种“来自轨道的核武器”方法,可能不是你所需要的。基于此调查,我认为您需要自己修改routes哈希值。

对于当前版本的代码,这看起来对我来说是“安全的”,因为route!方法总是查找当前的路由数组并正常迭代它们(没有缓存):

def route!(base = settings, pass_block=nil)
  if routes = base.routes[@request.request_method]
    routes.each do |pattern, keys, conditions, block|
      pass_block = process_route(pattern, keys, conditions) do |*args|
        route_eval { block[*args] }
      end
    end
  end

  # Run routes defined in superclass.
  if base.superclass.respond_to?(:routes)
    return route!(base.superclass, pass_block)
  end

  route_eval(&pass_block) if pass_block
  route_missing
end

Sinatra内部存储路线的内部在最近的版本中发生了变化,因此我不会依赖于这种情况,而不会在每次新发布时都进行测试。更好的是,提出一个补丁,看看你是否可以将所接受的功能整合到主库中。

答案 1 :(得分:2)

可能是你强调这种做法,

before '/the_path_you_want_to_remove' do
   redirect '/the_path_is_default_page_or_someting'
end

您可以将此before操作用于覆盖要删除的路由,因此不会访问和实施该路由。

如果您想再次启用该路线,只需删除before操作。

或删除数组disable_routes中的项目

before do
    disable_routes = ['/test', '/test/*', '/test*']
    redirect '/default_page' if disable_routes.include?(request.path_info)
end

答案 2 :(得分:0)

您可以通过设置后块来阻止路线返回任何内容。