你如何从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
您可以通过设置后块来阻止路由返回任何内容。