Не удается найти маршрут метода в любом исходном коде sinatra - PullRequest
0 голосов
/ 21 января 2012

Я хочу выяснить связь между Rack и Sinatra, поэтому я копаюсь в исходном коде, а затем нашел определение метода базового класса get:

def get(path, opts={}, &block)
  conditions = @conditions.dup
  route('GET', path, opts, &block)

  @conditions = conditions
  route('HEAD', path, opts, &block)
end

Теперь, каков метод: маршрут? В настоящее время я использую инструмент для дворовых документов, но я не могу найти определение маршрута ни в одном коде Синатры или даже в коде стойки.

1 Ответ

2 голосов
/ 21 января 2012

Вы не очень хорошо искали исходный код :) На 10 строк ниже #get в определении метода есть определение route приватный метод:

# lib/sinatra/base.rb, line 1212
private
      def route(verb, path, options={}, &block)
        # Because of self.options.host
        host_name(options.delete(:host)) if options.key?(:host)
        enable :empty_path_info if path == "" and empty_path_info.nil?
        signature = compile!(verb, path, block, options)
        (@routes[verb] ||= []) << signature
        invoke_hook(:route_added, verb, path, block)
        signature
      end

Это приватный метод ивы не найдете его в документации Синатры.

Обычно этот метод выполняет следующие действия: он создает proc из переданного &block, объединяет его с путем http, ключами и условиями вызова (внутри compile! метода) и сохраняет его в переменной экземпляра класса @routes[verb], такэтот блок можно найти по пути и условиям и выполнить позже (для этого класса также определен attr_reader :routes, чтобы другие классы могли получить доступ к его переменной экземпляра @routes).

Позже, когда вы получите http-запрос, соответствующий этому маршруту (@request переменная экземпляра класса Base), блок будет выполнен внутри метода Base#route! (см. Строку 795).

Я быРекомендую использовать некоторые IDE, которые помогают исследовать исходный код.Например, я использую Rubymine для этой цели и его функцию Go To -> Declaration: просто наведите курсор на переменную / method / class / etc, нажмите F12 и Rubymine найдет его для вас, даже в исходном кодеподключенные драгоценные камни.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...