Class: Rails::Application

Inherits:
Engine show all
Defined in:
lib/rails/application.rb,
lib/rails/application/finisher.rb,
lib/rails/application/bootstrap.rb,
lib/rails/application/configuration.rb,
lib/rails/application/routes_reloader.rb

Overview

In Rails 3.0, a Rails::Application object was introduced which is nothing more than an Engine but with the responsibility of coordinating the whole boot process.

Initialization

Rails::Application is responsible for executing all railties and engines initializers. It also executes some bootstrap initializers (check Rails::Application::Bootstrap) and finishing initializers, after all the others are executed (check Rails::Application::Finisher).

Configuration

Besides providing the same configuration as Rails::Engine and Rails::Railtie, the application object has several specific configurations, for example “cache_classes”, “consider_all_requests_local”, “filter_parameters”, “logger” and so forth.

Check Rails::Application::Configuration to see them all.

Routes

The application object is also responsible for holding the routes and reloading routes whenever the files change in development.

Middlewares

The Application is also responsible for building the middleware stack.

Booting process

The application is also responsible for setting up and executing the booting process. From the moment you require “config/application.rb” in your app, the booting process goes like this:

1)  require "config/boot.rb" to setup load paths
2)  require railties and engines
3)  Define Rails.application as "class MyApp::Application < Rails::Application"
4)  Run config.before_configuration callbacks
5)  Load config/environments/ENV.rb
6)  Run config.before_initialize callbacks
7)  Run Railtie#initializer defined by railties, engines and application.
    One by one, each engine sets up its load paths, routes and runs its config/initializers/* files.
8)  Custom Railtie#initializers added by railties, engines and applications are executed
9)  Build the middleware stack and run to_prepare callbacks
10) Run config.before_eager_load and eager_load! if eager_load is true
11) Run config.after_initialize callbacks

Defined Under Namespace

Modules: Bootstrap, Finisher Classes: Configuration, RoutesReloader

Constant Summary

Constants inherited from Railtie

Railtie::ABSTRACT_RAILTIES

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Engine

#app, #eager_load!, endpoint, #endpoint, find, #helpers, isolate_namespace, #load_console, #load_generators, #load_runner, #load_seed, #load_tasks, #railties, #routes

Methods inherited from Railtie

abstract_railtie?, console, generators, railtie_name, #railtie_namespace, rake_tasks, runner, subclasses

Methods included from Initializable

included, #run_initializers

Constructor Details

#initializeApplication

Returns a new instance of Application.



77
78
79
80
81
82
83
84
85
# File 'lib/rails/application.rb', line 77

def initialize
  super
  @initialized      = false
  @reloaders        = []
  @routes_reloader  = nil
  @app_env_config   = nil
  @ordered_railties = nil
  @railties         = nil
end

Instance Attribute Details

#assetsObject

Returns the value of attribute assets.



71
72
73
# File 'lib/rails/application.rb', line 71

def assets
  @assets
end

#reloadersObject (readonly)

Returns the value of attribute reloaders.



73
74
75
# File 'lib/rails/application.rb', line 73

def reloaders
  @reloaders
end

#sandboxObject Also known as: sandbox?

Returns the value of attribute sandbox.



71
72
73
# File 'lib/rails/application.rb', line 71

def sandbox
  @sandbox
end

Class Method Details

.inherited(base) ⇒ Object



62
63
64
65
66
67
68
# File 'lib/rails/application.rb', line 62

def inherited(base)
  raise "You cannot have more than one Rails::Application" if Rails.application
  super
  Rails.application = base.instance
  Rails.application.add_lib_to_load_path!
  ActiveSupport.run_load_hooks(:before_configuration, base.instance)
end

Instance Method Details

#add_lib_to_load_path!Object

This method is called just after an application inherits from Rails::Application, allowing the developer to load classes in lib and use them during application configuration.

class MyApplication < Rails::Application
  require "my_backend" # in lib/my_backend
  config.i18n.backend = MyBackend
end

Notice this method takes into consideration the default root path. So if you are changing config.root inside your application definition or having a custom Rails application, you will need to add lib to $LOAD_PATH on your own in case you need to load files in lib/ during the application configuration as well.



182
183
184
185
# File 'lib/rails/application.rb', line 182

def add_lib_to_load_path! #:nodoc:
  path = File.join config.root, 'lib'
  $LOAD_PATH.unshift(path) if File.exist?(path)
end

#call(env) ⇒ Object

Implements call according to the Rack API. It simply dispatches the request to the underlying middleware stack.



94
95
96
97
98
# File 'lib/rails/application.rb', line 94

def call(env)
  env["ORIGINAL_FULLPATH"] = build_original_fullpath(env)
  env["ORIGINAL_SCRIPT_NAME"] = env["SCRIPT_NAME"]
  super(env)
end

#configObject

:nodoc:



226
227
228
# File 'lib/rails/application.rb', line 226

def config #:nodoc:
  @config ||= Application::Configuration.new(find_root_with_flag("config.ru", Dir.pwd))
end

#env_configObject

Stores some of the Rails initial environment parameters which will be used by middlewares and engines to configure themselves. Currently stores:

* "action_dispatch.parameter_filter"             => config.filter_parameters
* "action_dispatch.redirect_filter"              => config.filter_redirect
* "action_dispatch.secret_token"                 => config.secret_token
* "action_dispatch.secret_key_base"              => config.secret_key_base
* "action_dispatch.show_exceptions"              => config.action_dispatch.show_exceptions
* "action_dispatch.show_detailed_exceptions"     => config.consider_all_requests_local
* "action_dispatch.logger"                       => Rails.logger
* "action_dispatch.backtrace_cleaner"            => Rails.backtrace_cleaner
* "action_dispatch.key_generator"                => key_generator
* "action_dispatch.http_auth_salt"               => config.action_dispatch.http_auth_salt
* "action_dispatch.signed_cookie_salt"           => config.action_dispatch.signed_cookie_salt
* "action_dispatch.encrypted_cookie_salt"        => config.action_dispatch.encrypted_cookie_salt
* "action_dispatch.encrypted_signed_cookie_salt" => config.action_dispatch.encrypted_signed_cookie_salt


138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/rails/application.rb', line 138

def env_config
  @app_env_config ||= begin
    if config.secret_key_base.blank?
      ActiveSupport::Deprecation.warn "You didn't set config.secret_key_base. " +
        "Read the upgrade documentation to learn more about this new config option."

      if config.secret_token.blank?
        raise "You must set config.secret_key_base in your app's config."
      end
    end

    super.merge({
      "action_dispatch.parameter_filter" => config.filter_parameters,
      "action_dispatch.redirect_filter" => config.filter_redirect,
      "action_dispatch.secret_token" => config.secret_token,
      "action_dispatch.secret_key_base" => config.secret_key_base,
      "action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions,
      "action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local,
      "action_dispatch.logger" => Rails.logger,
      "action_dispatch.backtrace_cleaner" => Rails.backtrace_cleaner,
      "action_dispatch.key_generator" => key_generator,
      "action_dispatch.http_auth_salt" => config.action_dispatch.http_auth_salt,
      "action_dispatch.signed_cookie_salt" => config.action_dispatch.signed_cookie_salt,
      "action_dispatch.encrypted_cookie_salt" => config.action_dispatch.encrypted_cookie_salt,
      "action_dispatch.encrypted_signed_cookie_salt" => config.action_dispatch.encrypted_signed_cookie_salt
    })
  end
end

#helpers_pathsObject

:nodoc:



234
235
236
# File 'lib/rails/application.rb', line 234

def helpers_paths #:nodoc:
  config.helpers_paths
end

#initialize!(group = :default) ⇒ Object

Initialize the application passing the given group. By default, the group is :default but sprockets precompilation passes group equals to assets if initialize_on_precompile is false to avoid booting the whole app.



213
214
215
216
217
218
# File 'lib/rails/application.rb', line 213

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

#initialized?Boolean

Returns true if the application is initialized.

Returns:

  • (Boolean)


88
89
90
# File 'lib/rails/application.rb', line 88

def initialized?
  @initialized
end

#initializersObject

:nodoc:



220
221
222
223
224
# File 'lib/rails/application.rb', line 220

def initializers #:nodoc:
  Bootstrap.initializers_for(self) +
  railties_initializers(super) +
  Finisher.initializers_for(self)
end

#key_generatorObject

Return the application’s KeyGenerator



107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/rails/application.rb', line 107

def key_generator
  # number of iterations selected based on consultation with the google security
  # team. Details at https://github.com/rails/rails/pull/6952#issuecomment-7661220
  @caching_key_generator ||= begin
    if config.secret_key_base
      key_generator = ActiveSupport::KeyGenerator.new(config.secret_key_base, iterations: 1000)
      ActiveSupport::CachingKeyGenerator.new(key_generator)
    else
      ActiveSupport::LegacyKeyGenerator.new(config.secret_token)
    end
  end
end

#migration_railtiesObject

Return an array of railties respecting the order they’re loaded and the order specified by the railties_order config.

While when running initializers we need engines in reverse order here when copying migrations from railties we need then in the same order as given by railties_order



244
245
246
# File 'lib/rails/application.rb', line 244

def migration_railties # :nodoc:
  ordered_railties.flatten - [self]
end

#reload_routes!Object

Reload application routes regardless if they changed or not.



101
102
103
# File 'lib/rails/application.rb', line 101

def reload_routes!
  routes_reloader.reload!
end

#require_environment!Object

:nodoc:



187
188
189
190
# File 'lib/rails/application.rb', line 187

def require_environment! #:nodoc:
  environment = paths["config/environment"].existent.first
  require environment if environment
end

#routes_reloaderObject

:nodoc:



192
193
194
# File 'lib/rails/application.rb', line 192

def routes_reloader #:nodoc:
  @routes_reloader ||= RoutesReloader.new
end

#to_appObject

:nodoc:



230
231
232
# File 'lib/rails/application.rb', line 230

def to_app #:nodoc:
  self
end

#watchable_argsObject

Returns an array of file paths appended with a hash of directories-extensions suitable for ActiveSupport::FileUpdateChecker API.



199
200
201
202
203
204
205
206
207
# File 'lib/rails/application.rb', line 199

def watchable_args #:nodoc:
  files, dirs = config.watchable_files.dup, config.watchable_dirs.dup

  ActiveSupport::Dependencies.autoload_paths.each do |path|
    dirs[path.to_s] = [:rb]
  end

  [files, dirs]
end