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