root
に定義されています。ActionDispatch::Routing::Mapper::Base
これはに含まれていActionDispatch::Routing::Mapper
ます。
一見しただけではなく、舞台裏で起こっていることが少しあります。
の定義を見ると、そのdraw
理由がわかります。
# action_dispatch/routing/route_set.rb
def draw(&block)
# ...
eval_block(block)
# ...
end
ブロックは(を使用して)procに変換され、少し下に定義されているproc&
に渡されます。eval_block
def eval_block(block)
# ...
mapper = Mapper.new(self)
# ...
mapper.instance_exec(&block)
end
したがって、結局のところ、yield
まったく使用されていません。渡すブロックはApplication.routes.draw
、のインスタンスのコンテキストで評価されているだけですActionDispatch::Routing::Mapper
。
に追加puts self
するとconfig/routes.rb
、これが実際に動作していることがわかります。
Application.routes.draw do
puts self
end
実行するrake routes
と、次のようなものが得られます。
#<ActionDispatch::Routing::Mapper:0x007feadf52cbd8>
# ...
詳細については、以下を参照してください。
http://ruby-doc.org/core-1.8.7/Object.html#method-i-instance_exec
https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/route_set .rb#LC296
https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb#LC336
http://www.amazon.com/Metaprogramming-Ruby-Program-Like -長所/dp/ 1934356476