在sinatra的任何源代码中找不到方法路由

时间:2012-01-21 09:24:33

标签: ruby

我想弄清楚Rack和Sinatra之间的联系,所以我深入研究了源代码,然后我找到了基本类方法get的定义:

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

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

现在的方法是什么:路线?我目前正在使用码文档工具,我无法在任何Sinatra代码甚至Rack代码中找到路由的定义。

1 个答案:

答案 0 :(得分:2)

您没有很好地查找源代码:) #get方法定义下面的10行有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

这是一种私有方法,您不会在Sinatra文档中找到它。

通常,此方法执行以下操作:它从传递的&block创建proc,将其与http路径,键和调用条件(在compile!方法内)组合并将其存储在@routes[verb]类中实例变量,以便可以通过路径和条件找到块并稍后执行(此类也定义了attr_reader :routes,以便其他类可以访问其@routes实例变量)。

稍后当您获得匹配此路由的http请求(@request类的Base实例变量)时,该块将在Base#route!方法内执行(参见第795行)。

我建议你使用一些有助于检查源代码的IDE。例如,我为此目的使用Rubymine及其功能Go To -> Declaration:只需将光标放在变量/ method / class / etc上,按F12,Rubymine将为您找到它,即使在源代码中也是如此连接的宝石。