【问题标题】:where exactly is the rails "root" function defined?rails“root”函数到底是在哪里定义的?
【发布时间】:2013-02-04 22:35:39
【问题描述】:

我在 Rails 应用程序中看到类似以下内容:

Application.routes.draw do
    root :to => "accounts#index"
end

我被告知here,如果“/”是所要求的路径,这将定义 Rails 路由到的位置。但是,在 rails 代码中定义的这个“根”函数到底在哪里?我不明白要让这个技巧发挥作用,涉及到哪些范围界定问题。

我可以看到一个块被传递给draw 函数。所以我假设draw 函数调用yield 来执行传递的块。但我仍然不确定为什么root 函数会神奇地在传递的块的范围内。

【问题讨论】:

    标签: ruby-on-rails ruby scope rails-routing


    【解决方案1】:

    root 定义在ActionDispatch::Routing::Mapper::Base 上,ActionDispatch::Routing::Mapper 包含它。

    幕后发生的事情比乍看之下要多一些。

    如果我们看一下draw的定义,我们就知道为什么了:

    # action_dispatch/routing/route_set.rb
    def draw(&block)
      # ...
      eval_block(block)
      # ...
    end
    

    该块被转换为一个过程(使用&)并传递给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-Pros/dp/1934356476

    【讨论】:

    • 很棒的帖子!!感谢您的努力。
    【解决方案2】:

    https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/mapper.rb

    def root(options = {})
      options = { :to => options } if options.is_a?(String)
      match '/', { :as => :root, :via => :get }.merge!(options)
    end
    

    https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing.rb

    module Routing
      autoload :Mapper, 'action_dispatch/routing/mapper'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多