2012-01-21 18 views
0

RackとSinatraの間の接続を把握したいので、ソースコードを掘り下げてから、基本クラスメソッドの定義を見つけましたgetsinatraのソースコードでメソッドのルートを見つけることができません

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

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

ここではどのような方法がありますか?私は現在、庭文書ツールを使用しています、私はちょうどSinatraコードまたはラックコードのルートの定義を見つけることができません。

非常によく:) #getメソッド定義以下の10行 routeプライベートメソッドの定義があり
+0

'route'メソッドが一般的にどのように動作するかについていくつかの詳細を追加しました。 –

答えて

2
あなたがソースコードを見ていない

# 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インスタンス変数にアクセスできます)。

このルート(@requestインスタンス変数Baseクラス)と一致するHTTP要求を取得すると、ブロックはBase#route!メソッド(795行参照)内で実行されます。

私は、ソースコードを調べるのに役立つIDEを使用することをお勧めします。たとえば、私はこの目的でRubymineとその機能を使用します。Go To -> Declaration:変数/ method/class/etcにカーソルを置くだけで、F12を押すとRubyは接続された宝石のソースコードであってもそれを見つけます。

+0

偉大な優秀な説明と偉大な答え、私は100%それを把握しているわけではないが、それは私に感謝し始める、ハッピースプリングフェスティバル – mko

関連する問題