我想弄清楚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代码中找到路由的定义。
答案 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将为您找到它,即使在源代码中也是如此连接的宝石。