轨道::在Application.Initialize!方法源位置

时间:2013-11-05 11:38:41

标签: ruby-on-rails ruby

我想在我的博客应用程序的environment.rb

中找到以下行的来源
Blog::Application.initialize!

如果发现初始化!方法仅在源代码中的一个位置定义。

railties / LIB /轨道/ application.rb中

def initialize!(group=:default) #:nodoc:
  raise "Application has been already initialized." if @initialized

然而,它是一种实例方法。

我在rails控制台做了一些实验:

Blog::Application.initialize!  # => Application has been already initialized
Blog::Application.method(:initialize!)  # => undefined method for Class
Blog::Application.instance_methods.include?(:initialize!)  # => true

奇怪的是,当initialize!在Application类上可以清楚地调用时,我们得到一个未定义的方法。请帮助理解此代码。

1 个答案:

答案 0 :(得分:0)

这是由于一些Ruby Magic又名“Method Missing”:

Blog::Application.ancestors
=> [... Rails::Railtie::Configurable ...]

查看configurable.rb

module Rails
  class Railtie
    module Configurable
      extend ActiveSupport::Concern
      module ClassMethods
        [...]

        def method_missing(*args, &block)
          instance.send(*args, &block)
        end
      end
    end
  end
end

它将所有调用委托给底层应用程序实例。