ruby - 如何从 Sinatra 中删除路由?

标签 ruby routing sinatra

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

API 没有任何我能找到的方法来删除它们,我能想到的唯一其他方法是直接转到 Sinatra::Base 中的@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 存储路由的内部结构在最近的版本中发生了变化,所以我不会依赖它在没有对每个新版本进行测试的情况下始终工作。更好的是,提出一个补丁,看看是否可以将接受的功能合并到主库中。

关于ruby - 如何从 Sinatra 中删除路由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8212778/

相关文章:

ruby - 哈希方法使用什么相等性?

ruby-on-rails - 默认 :exclude option for Rails resource routing

angular - ASP.NET MVC5 应用程序捕获所有路由被忽略

ruby-on-rails - 如何在 Heroku 上提供嵌套的静态内容?

ruby - 如何使用 sinatra 的参数从提交的表单中获取所有选中的项目?

ruby - `retry` 不再评估开始 block

ruby - rspec "it"字符串

ruby-on-rails - rails4 未知编码名称 - CP720

html - 在静态 html 着陆页中路由

mysql - Sinatra、MySQL 和 ActiveRecord