【问题标题】:Can't find the method route in any source code of sinatra在sinatra的任何源代码中都找不到方法路由
【发布时间】:2012-01-21 19:54:34
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我添加了一些关于route 方法通常如何工作的细节。

标签: ruby


【解决方案1】:

你没有很好地寻找源代码:) #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 文档中找到它。

这个方法通常做以下事情:它从传递的&amp;block创建proc,将它与http路径、键和调用条件(在compile!方法内部)结合起来,并将其存储在@routes[verb]类实例变量中,这样块就可以通过路径和条件找到并稍后执行(该类还定义了attr_reader :routes,以便其他类可以访问其@routes 实例变量)。

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

我建议您使用一些有助于检查源代码的 IDE。例如,我为此使用Rubymine 及其功能Go To -&gt; Declaration:只需将光标放在变量/方法/类/等上,按 F12,Rubymine 就会为您找到它,即使在连接的 gem 的源代码中也是如此。

【讨论】:

  • 很好的答案,很好的解释,虽然我不是 100% 弄明白,但它开始对我有意义,春节快乐
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 2021-07-20
  • 2023-03-12
  • 1970-01-01
  • 2018-01-31
  • 2012-03-12
  • 2013-12-25
  • 2017-07-18
相关资源
最近更新 更多