一个负责协调整个启动过程的 Engine。
初始化¶ ↑
Rails::Application 负责执行所有 railties 和 engines 的初始化器。它还执行一些引导初始化器(参见 Rails::Application::Bootstrap)和完成初始化器(参见 Rails::Application::Finisher),在所有其他初始化器执行完毕后。
配置¶ ↑
除了提供与 Rails::Engine 和 Rails::Railtie 相同的配置外,应用程序对象还有一些特定的配置,例如 enable_reloading、consider_all_requests_local、filter_parameters、logger 等等。
请查看 Rails::Application::Configuration 以了解所有配置项。
路由¶ ↑
应用程序对象还负责持有路由,并在开发环境中文件更改时重新加载路由。
中间件¶ ↑
Application 还负责构建中间件堆栈。
启动过程¶ ↑
应用程序还负责设置和执行启动过程。从你在应用中 `require "config/application.rb"` 的那一刻起,启动过程如下:
-
`require "config/boot.rb"` 以设置加载路径。
-
`require` railties 和 engines。
-
将
Rails.application定义为class MyApp::Application < Rails::Application。 -
运行
config.before_configuration回调。 -
加载
config/environments/ENV.rb。 -
运行
config.before_initialize回调。 -
运行由 railties、engines 和应用程序定义的
Railtie#initializer。逐个地,每个 engine 设置其加载路径和路由,并运行其config/initializers/*文件。 -
由 railties、engines 和应用程序添加的自定义
Railtie#initializers被执行。 -
构建中间件堆栈并运行
to_prepare回调。 -
如果
eager_load为true,则运行config.before_eager_load和eager_load!。 -
运行
config.after_initialize回调。
- MODULE Rails::Application::Bootstrap
- MODULE Rails::Application::Finisher
- CLASS Rails::Application::Configuration
- CLASS Rails::Application::DefaultMiddlewareStack
- CLASS Rails::Application::RoutesReloader
- C
- D
- E
- F
- G
- I
- K
- M
- N
- R
- S
Attributes
| [RW] | assets | |
| [R] | autoloaders | |
| [W] | config | |
| [W] | credentials | |
| [R] | executor | |
| [R] | reloader | |
| [R] | reloaders | |
| [RW] | sandbox | |
| [RW] | sandbox? |
类公共方法
create(initial_variable_values = {}, &block) Link
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 82 def create(initial_variable_values = {}, &block) new(initial_variable_values, &block).run_load_hooks! end
find_root(from) Link
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 86 def find_root(from) find_root_with_flag "config.ru", from, Dir.pwd end
inherited(base) Link
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 69 def inherited(base) super Rails.app_class = base # lib has to be added to $LOAD_PATH unconditionally, even if it's in the # autoload paths and config.add_autoload_paths_to_load_path is false. add_lib_to_load_path!(find_root(base.called_from)) ActiveSupport.run_load_hooks(:before_configuration, base) end
instance() Link
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 78 def instance super.run_load_hooks! end
new(initial_variable_values = {}, &block) Link
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 107 def initialize(initial_variable_values = {}, &block) super() @initialized = false @reloaders = [] @routes_reloader = nil @app_env_config = nil @ordered_railties = nil @railties = nil @key_generators = {} @message_verifiers = nil @deprecators = nil @ran_load_hooks = false @executor = Class.new(ActiveSupport::Executor) @reloader = Class.new(ActiveSupport::Reloader) @reloader.executor = @executor @autoloaders = Rails::Autoloaders.new # are these actually used? @initial_variable_values = initial_variable_values @block = block end
实例公共方法
config_for(name, env: Rails.env) Link
方便地加载当前 Rails 环境的 `config/foo.yml`。例如:
# config/exception_notification.yml: production: url: http://127.0.0.1:8080 namespace: my_app_production development: url: https://:3001 namespace: my_app_development
# config/environments/production.rb Rails.application.configure do config.middleware.use ExceptionNotifier, config_for(:exception_notification) end
您也可以将配置存储在共享部分,它将被合并到环境配置中。
# config/example.yml
shared:
foo:
bar:
baz: 1
development:
foo:
bar:
qux: 2
# development environment Rails.application.config_for(:example)[:foo][:bar] # => { baz: 1, qux: 2 }
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 290 def config_for(name, env: Rails.env) yaml = name.is_a?(Pathname) ? name : Pathname.new("#{paths["config"].existent.first}/#{name}.yml") if yaml.exist? require "erb" all_configs = ActiveSupport::ConfigurationFile.parse(yaml).deep_symbolize_keys config, shared = all_configs[env.to_sym], all_configs[:shared] if shared config = {} if config.nil? && shared.is_a?(Hash) if config.is_a?(Hash) && shared.is_a?(Hash) config = shared.deep_merge(config) elsif config.nil? config = shared end end if config.is_a?(Hash) config = ActiveSupport::OrderedOptions.new.update(config) end config else raise "Could not load configuration. No such file - #{yaml}" end end
console(&blk) Link
将应用实例中调用的任何控制台方法传递给 Rails::Railtie 中定义的 console 方法。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 373 def console(&blk) self.class.console(&blk) end
credentials() Link
返回一个 ActiveSupport::EncryptedConfiguration 实例,用于指定的凭证文件 config.credentials.content_path。
默认情况下,config.credentials.content_path 将指向当前环境的 config/credentials/#{environment}.yml.enc(例如,对于 production 环境,指向 config/credentials/production.yml.enc),或者如果该文件不存在,则指向 config/credentials.yml.enc。
加密密钥从 ENV["RAILS_MASTER_KEY"] 或 config.credentials.key_path 指定的文件中获取。默认情况下,config.credentials.key_path 将指向当前环境的 config/credentials/#{environment}.key,或者如果该文件不存在,则指向 config/master.key。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 497 def credentials @credentials ||= encrypted(config.credentials.content_path, key_path: config.credentials.key_path) end
deprecators() Link
一个由 deprecator 管理的集合(ActiveSupport::Deprecation::Deprecators)。集合的配置方法会影响集合中的所有 deprecator。此外,集合的 silence 方法会在给定块的持续时间内静默集合中的所有 deprecator。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 246 def deprecators @deprecators ||= ActiveSupport::Deprecation::Deprecators.new.tap do |deprecators| deprecators[:railties] = Rails.deprecator end end
eager_load!() Link
预加载应用程序代码。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 555 def eager_load! Rails.autoloaders.each(&:eager_load) end
encrypted(path, key_path: "config/master.key", env_key: "RAILS_MASTER_KEY") Link
返回一个 ActiveSupport::EncryptedConfiguration 实例,用于一个加密文件。默认情况下,加密密钥从 ENV["RAILS_MASTER_KEY"] 或 config/master.key 文件中获取。
my_config = Rails.application.encrypted("config/my_config.enc") my_config.read # => "foo:\n bar: 123\n" my_config.foo.bar # => 123
可以使用 bin/rails encrypted:edit 命令编辑加密文件。(有关更多信息,请参阅 bin/rails encrypted:edit --help 的输出。)
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 516 def encrypted(path, key_path: "config/master.key", env_key: "RAILS_MASTER_KEY") ActiveSupport::EncryptedConfiguration.new( config_path: Rails.root.join(path), key_path: Rails.root.join(key_path), env_key: env_key, raise_if_missing_key: config.require_master_key ) end
env_config() Link
存储一些 Rails 初始环境参数,这些参数将由中间件和 engines 用于自我配置。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 319 def env_config @app_env_config ||= super.merge( "action_dispatch.parameter_filter" => filter_parameters, "action_dispatch.redirect_filter" => config.filter_redirect, "action_dispatch.secret_key_base" => secret_key_base, "action_dispatch.show_exceptions" => config.action_dispatch.show_exceptions, "action_dispatch.show_detailed_exceptions" => config.consider_all_requests_local, "action_dispatch.log_rescued_responses" => config.action_dispatch.log_rescued_responses, "action_dispatch.debug_exception_log_level" => ActiveSupport::Logger.const_get(config.action_dispatch.debug_exception_log_level.to_s.upcase), "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, "action_dispatch.authenticated_encrypted_cookie_salt" => config.action_dispatch.authenticated_encrypted_cookie_salt, "action_dispatch.use_authenticated_cookie_encryption" => config.action_dispatch.use_authenticated_cookie_encryption, "action_dispatch.encrypted_cookie_cipher" => config.action_dispatch.encrypted_cookie_cipher, "action_dispatch.signed_cookie_digest" => config.action_dispatch.signed_cookie_digest, "action_dispatch.cookies_serializer" => config.action_dispatch.cookies_serializer, "action_dispatch.cookies_digest" => config.action_dispatch.cookies_digest, "action_dispatch.cookies_rotations" => config.action_dispatch.cookies_rotations, "action_dispatch.cookies_same_site_protection" => coerce_same_site_protection(config.action_dispatch.cookies_same_site_protection), "action_dispatch.use_cookies_with_metadata" => config.action_dispatch.use_cookies_with_metadata, "action_dispatch.content_security_policy" => config.content_security_policy, "action_dispatch.content_security_policy_report_only" => config.content_security_policy_report_only, "action_dispatch.content_security_policy_nonce_generator" => config.content_security_policy_nonce_generator, "action_dispatch.content_security_policy_nonce_directives" => config.content_security_policy_nonce_directives, "action_dispatch.permissions_policy" => config.permissions_policy, ) end
generators(&blk) Link
将应用实例中调用的任何生成器方法传递给 Rails::Railtie 中定义的 generators 方法。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 379 def generators(&blk) self.class.generators(&blk) end
initialized?() Link
如果应用程序已初始化,则返回 true。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 132 def initialized? @initialized end
initializer(name, opts = {}, &block) Link
将初始化器传递给 Rails::Initializable 模块中定义的 initializer 方法。每个 Rails::Application 类都有自己的初始化器集合,如 Initializable 模块所定义。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 361 def initializer(name, opts = {}, &block) self.class.initializer(name, opts, &block) end
isolate_namespace(mod) Link
将 isolate_namespace 方法传递给类方法。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 390 def isolate_namespace(mod) self.class.isolate_namespace(mod) end
key_generator(secret_key_base = self.secret_key_base) Link
返回一个指定 secret_key_base 的密钥生成器(ActiveSupport::CachingKeyGenerator)。返回值会被 memoize,因此使用相同 secret_key_base 的后续调用将返回相同的密钥生成器实例。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 174 def key_generator(secret_key_base = self.secret_key_base) # number of iterations selected based on consultation with the google security # team. Details at https://github.com/rails/rails/pull/6952#issuecomment-7661220 @key_generators[secret_key_base] ||= ActiveSupport::CachingKeyGenerator.new( ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000) ) end
message_verifier(verifier_name) Link
返回一个消息验证器对象。
此验证器可用于在应用程序中生成和验证签名消息。
建议不要对不同的事情使用相同的验证器,因此你可以通过传递 verifier_name 参数来获取不同的验证器。
例如,ActiveStorage::Blob.signed_id_verifier 就是使用此功能实现的,它确保 ID 字符串未被篡改,并且可以安全地用于查找。
有关更多信息,请参阅 ActiveSupport::MessageVerifier 文档。
参数¶ ↑
-
verifier_name- 消息验证器的名称。
示例¶ ↑
message = Rails.application.message_verifier('my_purpose').generate('data to sign against tampering') Rails.application.message_verifier('my_purpose').verify(message) # => 'data to sign against tampering'
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 238 def message_verifier(verifier_name) message_verifiers[verifier_name] end
message_verifiers() Link
返回一个消息验证器工厂(ActiveSupport::MessageVerifiers)。此工厂可用作配置和创建应用程序的消息验证器(ActiveSupport::MessageVerifier)的中心点。
默认情况下,由此工厂创建的消息验证器将使用默认的 ActiveSupport::MessageVerifier 选项生成消息。你可以通过组合 ActiveSupport::MessageVerifiers#clear_rotations 和 ActiveSupport::MessageVerifiers#rotate 来覆盖这些选项。但是,这必须在构建任何消息验证器实例之前完成。例如,在 before_initialize 块中:
# Use `url_safe: true` when generating messages config.before_initialize do |app| app.message_verifiers.clear_rotations app.message_verifiers.rotate(url_safe: true) end
由此工厂创建的消息验证器在生成消息时始终使用从 secret_key_base 派生的密钥。clear_rotations 不会影响此行为。但是,旧的 secret_key_base 值可以被轮换以验证消息。
# Fall back to old `secret_key_base` when verifying messages config.before_initialize do |app| app.message_verifiers.rotate(secret_key_base: "old secret_key_base") end
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 210 def message_verifiers @message_verifiers ||= ActiveSupport::MessageVerifiers.new do |salt, secret_key_base: self.secret_key_base| key_generator(secret_key_base).generate_key(salt) end.rotate_defaults end
name() Link
返回 dasherized 应用程序名称。
MyApp::Application.new.name => "my-app"
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 139 def name self.class.name.underscore.dasherize.delete_suffix("/application") end
rake_tasks(&block) Link
如果你尝试在实例上定义一组 Rake 任务,这些任务将被传递给应用程序类上定义的 Rake 任务。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 354 def rake_tasks(&block) self.class.rake_tasks(&block) end
reload_routes!() Link
重新加载应用程序路由,无论它们是否已更改。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 158 def reload_routes! if routes_reloader.execute_unless_loaded routes_reloader.loaded = false else routes_reloader.reload! end end
runner(&blk) Link
将应用实例中调用的任何 runner 方法传递给 Rails::Railtie 中定义的 runner 方法。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 367 def runner(&blk) self.class.runner(&blk) end
secret_key_base() Link
secret_key_base 用作应用程序密钥生成器的输入密钥,该密钥反过来用于创建所有 ActiveSupport::MessageVerifier 和 ActiveSupport::MessageEncryptor 实例,包括用于签名和加密 cookie 的实例。
我们首先在 ENV["SECRET_KEY_BASE"] 中查找它,然后在 credentials.secret_key_base 中查找。对于大多数应用程序,正确的存储位置是加密的凭证文件。
在开发和测试环境中,如果 secret_key_base 仍然为空,它将被随机生成并存储在 tmp/local_secret.txt 的临时文件中。
通过设置 ENV["SECRET_KEY_BASE_DUMMY"] 也可以触发生成随机的 secret_key_base 并将其存储在 tmp/local_secret.txt 中。这在预编译生产环境资源时非常有用,作为构建步骤的一部分,该步骤否则不需要访问生产环境的秘密。
Dockerfile 示例:RUN SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 479 def secret_key_base config.secret_key_base end
server(&blk) Link
将应用实例中调用的任何 server 方法传递给 Rails::Railtie 中定义的 server 方法。
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 385 def server(&blk) self.class.server(&blk) end
实例保护方法
ensure_generator_templates_added() Link
Source: 显示 | 在 GitHub 上
# File railties/lib/rails/application.rb, line 633 def ensure_generator_templates_added configured_paths = config.generators.templates configured_paths.unshift(*(paths["lib/templates"].existent - configured_paths)) end