Class Rails::Initializer
In: vendor/rails/railties/lib/initializer.rb
Parent: Object

The Initializer is responsible for processing the Rails configuration, such as setting the $LOAD_PATH, requiring the right frameworks, initializing logging, and more. It can be run either as a single command that‘ll just use the default configuration, like this:

  Rails::Initializer.run

But normally it‘s more interesting to pass in a custom configuration through the block running:

  Rails::Initializer.run do |config|
    config.frameworks -= [ :action_mailer ]
  end

This will use the default configuration options from Rails::Configuration, but allow for overwriting on select areas.

Methods

Attributes

configuration  [R]  The Configuration instance used by this Initializer instance.
loaded_plugins  [R]  The set of loaded plugins.

Public Class methods

Create a new Initializer instance that references the given Configuration instance.

[Source]

    # File vendor/rails/railties/lib/initializer.rb, line 55
55:     def initialize(configuration)
56:       @configuration = configuration
57:       @loaded_plugins = []
58:     end

Runs the initializer. By default, this will invoke the process method, which simply executes all of the initialization routines. Alternately, you can specify explicitly which initialization routine you want:

  Rails::Initializer.run(:set_load_path)

This is useful if you only want the load path initialized, without incuring the overhead of completely loading the entire environment.

[Source]

    # File vendor/rails/railties/lib/initializer.rb, line 46
46:     def self.run(command = :process, configuration = Configuration.new)
47:       yield configuration if block_given?
48:       initializer = new configuration
49:       initializer.send(command)
50:       initializer
51:     end

Public Instance methods

Adds all load paths from plugins to the global set of load paths, so that code from plugins can be required (explicitly or automatically via Dependencies).

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 169
169:     def add_plugin_load_paths
170:       plugin_loader.add_plugin_load_paths
171:     end

Add the load paths used by support functions such as the info controller

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 164
164:     def add_support_load_paths
165:     end

Fires the user-supplied after_initialize block (Configuration#after_initialize)

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 335
335:     def after_initialize
336:       configuration.after_initialize_blocks.each do |block|
337:         block.call
338:       end
339:     end

Check for valid Ruby version This is done in an external file, so we can use it from the `rails` program as well without duplication.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 122
122:     def check_ruby_version
123:       require 'ruby_version_check'
124:     end

This initialization routine does nothing unless :active_record is one of the frameworks to load (Configuration#frameworks). If it is, this sets the database configuration from Configuration#database_configuration and then establishes the connection.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 232
232:     def initialize_database
233:       if configuration.frameworks.include?(:active_record)
234:         ActiveRecord::Base.configurations = configuration.database_configuration
235:         ActiveRecord::Base.establish_connection
236:       end
237:     end

Sets the dependency loading mechanism based on the value of Configuration#cache_classes.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 299
299:     def initialize_dependency_mechanism
300:       Dependencies.mechanism = configuration.cache_classes ? :require : :load
301:     end

This initialization sets $KCODE to ‘u’ to enable the multibyte safe operations. Plugin authors supporting other encodings should override this behaviour and set the relevant default_charset on ActionController::Base

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 224
224:     def initialize_encoding
225:       $KCODE='u'
226:     end

Sets the logger for ActiveRecord, ActionController, and ActionMailer (but only for those frameworks that are to be loaded). If the framework‘s logger is already set, it is not changed, otherwise it is set to use RAILS_DEFAULT_LOGGER.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 273
273:     def initialize_framework_logging
274:       for framework in ([ :active_record, :action_controller, :action_mailer ] & configuration.frameworks)
275:         framework.to_s.camelize.constantize.const_get("Base").logger ||= RAILS_DEFAULT_LOGGER
276:       end
277:     end

Initializes framework-specific settings for each of the loaded frameworks (Configuration#frameworks). The available settings map to the accessors on each of the corresponding Base classes.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 324
324:     def initialize_framework_settings
325:       configuration.frameworks.each do |framework|
326:         base_class = framework.to_s.camelize.constantize.const_get("Base")
327: 
328:         configuration.send(framework).each do |setting, value|
329:           base_class.send("#{setting}=", value)
330:         end
331:       end
332:     end

Sets +ActionController::Base#view_paths+ and +ActionMailer::Base#template_root+ (but only for those frameworks that are to be loaded). If the framework‘s paths have already been set, it is not changed, otherwise it is set to use Configuration#view_path.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 283
283:     def initialize_framework_views
284:       ActionMailer::Base.template_root ||= configuration.view_path  if configuration.frameworks.include?(:action_mailer)
285:       ActionController::Base.view_paths = [configuration.view_path] if configuration.frameworks.include?(:action_controller) && ActionController::Base.view_paths.empty?
286:     end

If the RAILS_DEFAULT_LOGGER constant is already set, this initialization routine does nothing. If the constant is not set, and Configuration#logger is not nil, this also does nothing. Otherwise, a new logger instance is created at Configuration#log_path, with a default log level of Configuration#log_level.

If the log could not be created, the log will be set to output to STDERR, with a log level of WARN.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 247
247:     def initialize_logger
248:       # if the environment has explicitly defined a logger, use it
249:       return if defined?(RAILS_DEFAULT_LOGGER)
250: 
251:       unless logger = configuration.logger
252:         begin
253:           logger = ActiveSupport::BufferedLogger.new(configuration.log_path)
254:           logger.level = ActiveSupport::BufferedLogger.const_get(configuration.log_level.to_s.upcase)
255:           logger.auto_flushing = false if configuration.environment == "production"
256:         rescue StandardError =>e
257:           logger = ActiveSupport::BufferedLogger.new(STDERR)
258:           logger.level = ActiveSupport::BufferedLogger::WARN
259:           logger.warn(
260:             "Rails Error: Unable to access log file. Please ensure that #{configuration.log_path} exists and is chmod 0666. " +
261:             "The log level has been raised to WARN and the output directed to STDERR until the problem is fixed."
262:           )
263:         end
264:       end
265: 
266:       silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger }
267:     end

If ActionController is not one of the loaded frameworks (Configuration#frameworks) this does nothing. Otherwise, it loads the routing definitions and sets up loading module used to lazily load controllers (Configuration#controller_paths).

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 291
291:     def initialize_routing
292:       return unless configuration.frameworks.include?(:action_controller)
293:       ActionController::Routing.controller_paths = configuration.controller_paths
294:       ActionController::Routing::Routes.reload
295:     end

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 309
309:     def initialize_temporary_directories
310:       if configuration.frameworks.include?(:action_controller)
311:         session_path = "#{configuration.root_path}/tmp/sessions/"
312:         ActionController::Base.session_options[:tmpdir] = File.exist?(session_path) ? session_path : Dir::tmpdir
313: 
314:         cache_path = "#{configuration.root_path}/tmp/cache/"
315:         if File.exist?(cache_path)
316:           ActionController::Base.fragment_cache_store = :file_store, cache_path
317:         end
318:       end
319:     end

Loads support for "whiny nil" (noisy warnings when methods are invoked on nil values) if Configuration#whiny_nils is true.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 305
305:     def initialize_whiny_nils
306:       require('active_support/whiny_nil') if configuration.whiny_nils
307:     end

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 341
341:     def load_application_initializers
342:       Dir["#{configuration.root_path}/config/initializers/**/*.rb"].sort.each do |initializer|
343:         load(initializer)
344:       end
345:     end

Loads the environment specified by Configuration#environment_path, which is typically one of development, test, or production.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 199
199:     def load_environment
200:       silence_warnings do
201:         return if @environment_loaded
202:         @environment_loaded = true
203:         
204:         config = configuration
205:         constants = self.class.constants
206:         
207:         eval(IO.read(configuration.environment_path), binding, configuration.environment_path)
208:         
209:         (self.class.constants - constants).each do |const|
210:           Object.const_set(const, self.class.const_get(const))
211:         end
212:       end
213:     end

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 215
215:     def load_observers
216:       if configuration.frameworks.include?(:active_record)
217:         ActiveRecord::Base.instantiate_observers
218:       end
219:     end

Loads all plugins in config.plugin_paths. plugin_paths defaults to vendor/plugins but may also be set to a list of paths, such as

  config.plugin_paths = ["#{RAILS_ROOT}/lib/plugins", "#{RAILS_ROOT}/vendor/plugins"]

In the default implementation, as each plugin discovered in plugin_paths is initialized:

  • its lib directory, if present, is added to the load path (immediately after the applications lib directory)
  • init.rb is evaluated, if present

After all plugins are loaded, duplicates are removed from the load path. If an array of plugin names is specified in config.plugins, only those plugins will be loaded and they plugins will be loaded in that order. Otherwise, plugins are loaded in alphabetical order.

if config.plugins ends contains :all then the named plugins will be loaded in the given order and all other plugins will be loaded in alphabetical order

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 189
189:     def load_plugins
190:       plugin_loader.load_plugins
191:     end

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 193
193:     def plugin_loader
194:       @plugin_loader ||= configuration.plugin_loader.new(self)
195:     end

Sequentially step through all of the available initialization routines, in order:

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 84
 84:     def process
 85:       check_ruby_version
 86:       set_load_path
 87:       
 88:       require_frameworks
 89:       set_autoload_paths
 90:       add_plugin_load_paths
 91:       load_environment
 92: 
 93:       initialize_encoding
 94:       initialize_database
 95:       initialize_logger
 96:       initialize_framework_logging
 97:       initialize_framework_views
 98:       initialize_dependency_mechanism
 99:       initialize_whiny_nils
100:       initialize_temporary_directories
101:       initialize_framework_settings
102: 
103:       add_support_load_paths
104: 
105:       load_plugins
106: 
107:       # Observers are loaded after plugins in case Observers or observed models are modified by plugins.
108:       load_observers
109: 
110:       # Routing must be initialized after plugins to allow the former to extend the routes
111:       initialize_routing
112: 
113:       # the framework is now fully initialized
114:       after_initialize
115: 
116:       load_application_initializers
117:     end

Requires all frameworks specified by the Configuration#frameworks list. By default, all frameworks (ActiveRecord, ActiveSupport, ActionPack, ActionMailer, and ActiveResource) are loaded.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 156
156:     def require_frameworks
157:       configuration.frameworks.each { |framework| require(framework.to_s) }
158:     rescue LoadError => e
159:       # re-raise because Mongrel would swallow it
160:       raise e.to_s
161:     end

Set the paths from which Rails will automatically load source files, and the load_once paths.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 136
136:     def set_autoload_paths
137:       Dependencies.load_paths = configuration.load_paths.uniq
138:       Dependencies.load_once_paths = configuration.load_once_paths.uniq
139: 
140:       extra = Dependencies.load_once_paths - Dependencies.load_paths
141:       unless extra.empty?
142:         abort "load_once_paths must be a subset of the load_paths.\nExtra items in load_once_paths: \#{extra * ','}\n"
143:       end
144: 
145:       # Freeze the arrays so future modifications will fail rather than do nothing mysteriously
146:       configuration.load_once_paths.freeze
147:     end

Set the $LOAD_PATH based on the value of Configuration#load_paths. Duplicates are removed.

[Source]

     # File vendor/rails/railties/lib/initializer.rb, line 128
128:     def set_load_path
129:       load_paths = configuration.load_paths + configuration.framework_paths
130:       load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) }
131:       $LOAD_PATH.uniq!
132:     end

[Validate]