icon Ruby on Rails 2.0 日记

第7章 config/initializers 目录

Rails 2.0 以前,config/environments.rb 中写入了程序特有的初始化代码,2.0 以后 config/initializers 目录的文件能自动被读取。

这个功能是怎么实现的呢。

rails-2.0.2 目录下,搜索含有字符串 'initializers' 的文件,马上便找到了相关的代码 initializer.rbRails::Initializer#load_application_initializers 是这个问题的方法。

    def load_application_initializers
      Dir["#{configuration.root_path}/config/initializers/**/*.rb"].sort.each do |initializer|
        load(initializer)
      end
    end

Dir[pattern] 返回匹配 pattern 的路径名的数组。将它进行 sort 然后通过each ,一个一个的读取。是按文件名顺序读取的。

然后,从 Rails::Initializer#process 方法中调用这个方法。

    def process
      check_ruby_version
      
      # (省略)

      load_application_initializers
    end

继续探寻的话,得到了类方法 Rails::Initializer.run 的代码 initializer.send(command)

    def self.run(command = :process, configuration = Configuration.new)
      yield configuration if block_given?
      initializer = new configuration
      initializer.send(command)
      initializer
    end

变量 command 的内容是符号 :process ,所以和执行 initializer.process 一样。

那么,Rails::Initializer.run 是从什么地方调用的呢。答案就在你程序的 config/environment.rb 之中。

Rails::Initializer.run do |config|
  # (省略)
end

(2008/02/27)