Просматривая код в течение нескольких минут, я не вижу ни одного кода, который «деструктивно» мутирует 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!
*Метод 1010 * всегда ищет текущий массив маршрутов и выполняет их итерацию в обычном режиме (кэширование отсутствует):
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, связанные с хранением маршрутов, сместились в последних выпусках, поэтому я не буду полагатьсяна этом всегда работает без тестирования с каждым новым выпуском.А еще лучше, предложите патч и посмотрите, сможете ли вы включить принятую функциональность в основную библиотеку.