root
定义在 上ActionDispatch::Routing::Mapper::Base
,包含在 中ActionDispatch::Routing::Mapper
。
幕后发生的事情比乍看之下要多一些。
如果我们看一下 的定义draw
,我们就会明白为什么:
# action_dispatch/routing/route_set.rb
def draw(&block)
# ...
eval_block(block)
# ...
end
该块被转换为一个 proc (with &
) 并传递给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