Как вы удаляете маршрут из Синатры? - PullRequest
3 голосов
/ 21 ноября 2011

У меня есть несколько динамически загружаемых плагинов, которые регистрируют свои маршруты при запуске, однако мне также нужно иметь возможность удалять их маршруты, когда они отключены.Есть ли способ удалить существующие маршруты?

У API не было никаких методов, которые я мог бы найти, чтобы удалить их, и единственный другой способ, которым я мог подумать, это перейти прямо к @routesобъект в Sinatra :: Base, но я не уверен, что вы можете сделать что-нибудь с этим, и если вы можете ... это безопасно сделать?

Ответы [ 3 ]

3 голосов
/ 22 ноября 2011

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

2 голосов
/ 25 ноября 2011

Может быть, вы принимаете этот подход,

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
0 голосов
/ 25 ноября 2011

Можно запретить маршруту возвращать что-либо, установив блок после.

...