我有一些动态加载的插件,它们在启动时注册它们的路由,但是我还需要能够在它们被禁用时删除它们的路由。有没有办法删除现有路线?
API没有任何方法可以删除它们,而我能想到的另一种方法就是直接进入Sinatra :: Base中的@routes对象,但我不确定如果你可以做任何事情,如果可以......这样做是否安全?
答案 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)
您可以通过设置后块来阻止路线返回任何内容。