你如何从Sinatra中删除路线?

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

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

通过代码查看几分钟,我没有看到任何代码“破坏性地”改变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! ,这看起来对我来说是“安全的” 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内部存储路径的内部在最近的版本中发生了变化,因此我不会依赖于它在没有测试每个新版本的情况下始终工作。 更好的是,提出一个补丁,看看你是否可以将所接受的function整合到主库中。

可能是你这种做法的做法,

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

您可以在执行此操作之前覆盖要删除的路由,因此不会访问和实现路由。

如果要再次启用该路由,只需删除before操作即可。

或者删除数组disable_routes中的项目

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

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