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.
configuration | [R] | The Configuration instance used by this Initializer instance. |
loaded_plugins | [R] | The set of loaded plugins. |
Create a new Initializer instance that references the given Configuration instance.
# 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.
# 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
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).
# 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
# 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)
# 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.
# 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.
# 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.
# 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
# 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.
# 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.
# 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.
# 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.
# 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).
# 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
# 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.
# 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
# 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.
# 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
# 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:
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
# File vendor/rails/railties/lib/initializer.rb, line 189 189: def load_plugins 190: plugin_loader.load_plugins 191: end
# 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:
# 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.
# 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.
# 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.
# 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