| Class | Rails::Initializer |
| In: |
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 railties/lib/initializer.rb, line 55 def initialize(configuration) @configuration = configuration @loaded_plugins = [] 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 railties/lib/initializer.rb, line 46 def self.run(command = :process, configuration = Configuration.new) yield configuration if block_given? initializer = new configuration initializer.send(command) initializer end
Add the load paths used by support functions such as the info controller
# File railties/lib/initializer.rb, line 159 def add_support_load_paths end
Fires the user-supplied after_initialize block (Configuration#after_initialize)
# File railties/lib/initializer.rb, line 326 def after_initialize configuration.after_initialize_blocks.each do |block| block.call end 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 railties/lib/initializer.rb, line 120 def check_ruby_version require 'ruby_version_check' 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 railties/lib/initializer.rb, line 223 def initialize_database if configuration.frameworks.include?(:active_record) ActiveRecord::Base.configurations = configuration.database_configuration ActiveRecord::Base.establish_connection end end
Sets the dependency loading mechanism based on the value of Configuration#cache_classes.
# File railties/lib/initializer.rb, line 290 def initialize_dependency_mechanism Dependencies.mechanism = configuration.cache_classes ? :require : :load end
This initialzation 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 railties/lib/initializer.rb, line 215 def initialize_encoding $KCODE='u' 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 railties/lib/initializer.rb, line 264 def initialize_framework_logging for framework in ([ :active_record, :action_controller, :action_mailer ] & configuration.frameworks) framework.to_s.camelize.constantize.const_get("Base").logger ||= RAILS_DEFAULT_LOGGER end 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 railties/lib/initializer.rb, line 315 def initialize_framework_settings configuration.frameworks.each do |framework| base_class = framework.to_s.camelize.constantize.const_get("Base") configuration.send(framework).each do |setting, value| base_class.send("#{setting}=", value) end end 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 railties/lib/initializer.rb, line 274 def initialize_framework_views ActionMailer::Base.template_root ||= configuration.view_path if configuration.frameworks.include?(:action_mailer) ActionController::Base.view_paths = [configuration.view_path] if configuration.frameworks.include?(:action_controller) && ActionController::Base.view_paths.empty? 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 railties/lib/initializer.rb, line 238 def initialize_logger # if the environment has explicitly defined a logger, use it return if defined?(RAILS_DEFAULT_LOGGER) unless logger = configuration.logger begin logger = ActiveSupport::BufferedLogger.new(configuration.log_path) logger.level = ActiveSupport::BufferedLogger.const_get(configuration.log_level.to_s.upcase) logger.auto_flushing = false if configuration.environment == "production" rescue StandardError =>e logger = ActiveSupport::BufferedLogger.new(STDERR) logger.level = ActiveSupport::BufferedLogger::WARN logger.warn( "Rails Error: Unable to access log file. Please ensure that #{configuration.log_path} exists and is chmod 0666. " + "The log level has been raised to WARN and the output directed to STDERR until the problem is fixed." ) end end silence_warnings { Object.const_set "RAILS_DEFAULT_LOGGER", logger } 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 railties/lib/initializer.rb, line 282 def initialize_routing return unless configuration.frameworks.include?(:action_controller) ActionController::Routing.controller_paths = configuration.controller_paths ActionController::Routing::Routes.reload end
# File railties/lib/initializer.rb, line 300 def initialize_temporary_directories if configuration.frameworks.include?(:action_controller) session_path = "#{configuration.root_path}/tmp/sessions/" ActionController::Base.session_options[:tmpdir] = File.exist?(session_path) ? session_path : Dir::tmpdir cache_path = "#{configuration.root_path}/tmp/cache/" if File.exist?(cache_path) ActionController::Base.fragment_cache_store = :file_store, cache_path end end end
Loads support for "whiny nil" (noisy warnings when methods are invoked on nil values) if Configuration#whiny_nils is true.
# File railties/lib/initializer.rb, line 296 def initialize_whiny_nils require('active_support/whiny_nil') if configuration.whiny_nils end
# File railties/lib/initializer.rb, line 332 def load_application_initializers Dir["#{configuration.root_path}/config/initializers/**/*.rb"].sort.each do |initializer| load(initializer) end end
Loads the environment specified by Configuration#environment_path, which is typically one of development, test, or production.
# File railties/lib/initializer.rb, line 190 def load_environment silence_warnings do return if @environment_loaded @environment_loaded = true config = configuration constants = self.class.constants eval(IO.read(configuration.environment_path), binding, configuration.environment_path) (self.class.constants - constants).each do |const| Object.const_set(const, self.class.const_get(const)) end end end
# File railties/lib/initializer.rb, line 206 def load_observers if configuration.frameworks.include?(:active_record) ActiveRecord::Base.instantiate_observers end 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"]
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 railties/lib/initializer.rb, line 178 def load_plugins configuration.plugin_locators.each do |locator| locator.new(self).each do |plugin| plugin.load end end ensure_all_registered_plugins_are_loaded! $LOAD_PATH.uniq! end
Sequentially step through all of the available initialization routines, in order:
# File railties/lib/initializer.rb, line 83 def process check_ruby_version set_load_path require_frameworks set_autoload_paths load_environment initialize_encoding initialize_database initialize_logger initialize_framework_logging initialize_framework_views initialize_dependency_mechanism initialize_whiny_nils initialize_temporary_directories initialize_framework_settings add_support_load_paths load_plugins # Observers are loaded after plugins in case Observers or observed models are modified by plugins. load_observers # Routing must be initialized after plugins to allow the former to extend the routes initialize_routing # the framework is now fully initialized after_initialize load_application_initializers end
Requires all frameworks specified by the Configuration#frameworks list. By default, all frameworks (ActiveRecord, ActiveSupport, ActionPack, ActionMailer, and ActiveResource) are loaded.
# File railties/lib/initializer.rb, line 154 def require_frameworks configuration.frameworks.each { |framework| require(framework.to_s) } end
Set the paths from which Rails will automatically load source files, and the load_once paths.
# File railties/lib/initializer.rb, line 134 def set_autoload_paths Dependencies.load_paths = configuration.load_paths.uniq Dependencies.load_once_paths = configuration.load_once_paths.uniq extra = Dependencies.load_once_paths - Dependencies.load_paths unless extra.empty? abort "load_once_paths must be a subset of the load_paths.\nExtra items in load_once_paths: \#{extra * ','}\n" end # Freeze the arrays so future modifications will fail rather than do nothing mysteriously configuration.load_once_paths.freeze end
Set the $LOAD_PATH based on the value of Configuration#load_paths. Duplicates are removed.
# File railties/lib/initializer.rb, line 126 def set_load_path load_paths = configuration.load_paths + configuration.framework_paths load_paths.reverse_each { |dir| $LOAD_PATH.unshift(dir) if File.directory?(dir) } $LOAD_PATH.uniq! end
# File railties/lib/initializer.rb, line 339 def ensure_all_registered_plugins_are_loaded! unless configuration.plugins.nil? if configuration.plugins.detect {|plugin| plugin != :all && !loaded_plugins.include?( plugin)} missing_plugins = configuration.plugins - (loaded_plugins + [:all]) raise LoadError, "Could not locate the following plugins: #{missing_plugins.to_sentence}" end end end