Spec-Zone.ru › Ruby on Rails 8.1

класс Rails::Application

Engine, отвечающий за координацию всего процесса загрузки.

Инициализация

Rails::Application отвечает за выполнение инициализаторов всех railties и движков. Он также выполняет некоторые инициализаторы начальной загрузки (см. Rails::Application::Bootstrap) и завершающие инициализаторы после выполнения всех остальных (см. Rails::Application::Finisher).

Конфигурация

Помимо предоставления той же конфигурации, что и Rails::Engine и Rails::Railtie, объект приложения имеет несколько собственных параметров конфигурации, например enable_reloading, consider_all_requests_local, filter_parameters, logger и так далее.

Полный список см. в разделе Rails::Application::Configuration.

Маршруты

Объект приложения также отвечает за хранение маршрутов и их перезагрузку при изменении файлов в режиме разработки.

Промежуточное ПО

Application также отвечает за построение стека промежуточного ПО.

Процесс загрузки

Приложение также отвечает за настройку и выполнение процесса загрузки. С момента подключения config/application.rb в приложении процесс загрузки проходит следующие этапы:

  1. require "config/boot.rb" для настройки путей загрузки.

  2. require railties и движки.

  3. Определить Rails.application как class MyApp::Application < Rails::Application.

  4. Выполнить обратные вызовы config.before_configuration.

  5. Загрузить config/environments/ENV.rb.

  6. Выполнить обратные вызовы config.before_initialize.

  7. Выполнить Railtie#initializer, определённые railties, движками и приложением. Один за другим движки настраивают свои пути загрузки и маршруты, а также выполняют файлы config/initializers/*.

  8. Выполняются пользовательские Railtie#initializers, добавленные railties, движками и приложениями.

  9. Построить стек промежуточного ПО и выполнить обратные вызовы to_prepare.

  10. Выполнить config.before_eager_load и eager_load!, если eager_load имеет значение true.

  11. Выполнить обратные вызовы config.after_initialize.

Атрибуты

assets [RW]
autoloaders [R]
config [W]
credentials [W]
executor [R]
reloader [R]
reloaders [R]
sandbox [RW]
sandbox? [RW]

Общедоступные методы класса

create (initial_variable_values = {}, &block) Показать исходный код
# 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) Показать исходный код
# File railties/lib/rails/application.rb, line 86
def find_root(from)
  find_root_with_flag "config.ru", from, Dir.pwd
end
inherited (base) Показать исходный код
# 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 () Показать исходный код
# File railties/lib/rails/application.rb, line 78
def instance
  super.run_load_hooks!
end
Вызывает метод суперкласса
new (initial_variable_values = {}, &block) Показать исходный код
# 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) Показать исходный код
# 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

Удобный способ загрузить config/foo.yml для текущего окружения Rails. Пример:

# config/exception_notification.yml:
production:
  url: http://127.0.0.1:8080
  namespace: my_app_production

development:
  url: http://localhost: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 }
console (&blk) Показать исходный код
# File railties/lib/rails/application.rb, line 373
def console(&blk)
  self.class.console(&blk)
end

Передаёт вызов любой консоли, запущенной в экземпляре нового приложения, методу console, определённому в Rails::Railtie.

credentials () Показать исходный код
# File railties/lib/rails/application.rb, line 497
def credentials
  @credentials ||= encrypted(config.credentials.content_path, key_path: config.credentials.key_path)
end

Возвращает экземпляр ActiveSupport::EncryptedConfiguration для файла учётных данных, указанного в config.credentials.content_path.

По умолчанию config.credentials.content_path указывает либо на config/credentials/#{environment}.yml.enc для текущего окружения (например, config/credentials/production.yml.enc для окружения production), либо на config/credentials.yml.enc, если этот файл не существует.

Ключ шифрования берётся из ENV["RAILS_MASTER_KEY"] либо из файла, указанного в config.credentials.key_path. По умолчанию config.credentials.key_path указывает либо на config/credentials/#{environment}.key для текущего окружения, либо на config/master.key, если этот файл не существует.

deprecators () Показать исходный код
# File railties/lib/rails/application.rb, line 246
def deprecators
  @deprecators ||= ActiveSupport::Deprecation::Deprecators.new.tap do |deprecators|
    deprecators[:railties] = Rails.deprecator
  end
end

Управляемая коллекция механизмов уведомления об устаревании (ActiveSupport::Deprecation::Deprecators). Методы настройки коллекции влияют на все механизмы в ней. Кроме того, метод коллекции silence отключает уведомления всех механизмов коллекции на время выполнения заданного блока.

eager_load! () Показать исходный код
# 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") Показать исходный код
# 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

Возвращает экземпляр 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.)

env_config () Показать исходный код
# 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

Сохраняет некоторые исходные параметры окружения Rails, которые промежуточное ПО и движки используют для своей настройки.

Вызывает метод суперкласса
generators (&blk) Показать исходный код
# File railties/lib/rails/application.rb, line 379
def generators(&blk)
  self.class.generators(&blk)
end

Передаёт вызовы любых генераторов, запущенных в экземпляре нового приложения, методу generators, определённому в Rails::Railtie.

initialized? () Показать исходный код
# File railties/lib/rails/application.rb, line 132
def initialized?
  @initialized
end

Возвращает true, если приложение инициализировано.

initializer (name, opts = {}, &block) Показать исходный код
# File railties/lib/rails/application.rb, line 361
def initializer(name, opts = {}, &block)
  self.class.initializer(name, opts, &block)
end

Передаёт инициализаторы методу initializer, определённому в модуле Rails::Initializable. У каждого класса Rails::Application есть собственный набор инициализаторов, определяемый модулем Initializable.

isolate_namespace (mod) Показать исходный код
# File railties/lib/rails/application.rb, line 390
def isolate_namespace(mod)
  self.class.isolate_namespace(mod)
end

Передаёт метод isolate_namespace методу класса.

key_generator (secret_key_base = self.secret_key_base) Показать исходный код
# 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

Возвращает генератор ключей (ActiveSupport::CachingKeyGenerator) для указанного secret_key_base. Возвращаемое значение кэшируется, поэтому повторные вызовы с тем же secret_key_base вернут тот же экземпляр генератора ключей.

message_verifier (verifier_name) Показать исходный код
# File railties/lib/rails/application.rb, line 238
def message_verifier(verifier_name)
  message_verifiers[verifier_name]
end

Возвращает объект для проверки сообщений.

Этот объект можно использовать для создания и проверки подписанных сообщений в приложении.

Рекомендуется не использовать один и тот же объект для разных целей. Чтобы получить разные объекты, передавайте аргумент verifier_name.

Например, ActiveStorage::Blob.signed_id_verifier реализован с помощью этой возможности, что гарантирует неизменность строк идентификаторов и безопасность их использования при поиске.

Дополнительные сведения см. в документации по 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'
message_verifiers () Показать исходный код
# 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

Возвращает фабрику объектов для проверки сообщений (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
name () Показать исходный код
# File railties/lib/rails/application.rb, line 139
def name
  self.class.name.underscore.dasherize.delete_suffix("/application")
end

Возвращает имя приложения в формате с дефисами.

MyApp::Application.new.name => "my-app"
rake_tasks (&block) Показать исходный код
# File railties/lib/rails/application.rb, line 354
def rake_tasks(&block)
  self.class.rake_tasks(&block)
end

Если вы попытаетесь определить набор задач Rake для экземпляра, они будут переданы задачам Rake, определённым для класса приложения.

reload_routes! () Показать исходный код
# 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) Показать исходный код
# File railties/lib/rails/application.rb, line 367
def runner(&blk)
  self.class.runner(&blk)
end

Передаёт вызов любого runner, запущенного в экземпляре нового приложения, методу runner, определённому в Rails::Railtie.

secret_key_base () Показать исходный код
# File railties/lib/rails/application.rb, line 479
def secret_key_base
  config.secret_key_base
end

secret_key_base используется как секретный входной ключ для генератора ключей приложения, который, в свою очередь, применяется для создания всех экземпляров ActiveSupport::MessageVerifier и ActiveSupport::MessageEncryptor, включая экземпляры для подписывания и шифрования файлов cookie.

Сначала мы ищем его в ENV["SECRET_KEY_BASE"], затем в credentials.secret_key_base. Для большинства приложений его следует хранить в зашифрованном файле учётных данных.

В средах разработки и тестирования, если значение secret_key_base ещё не задано, оно генерируется случайным образом и сохраняется во временном файле в tmp/local_secret.txt.

Случайную генерацию secret_key_base и сохранение в tmp/local_secret.txt также можно запустить, задав ENV["SECRET_KEY_BASE_DUMMY"]. Это полезно при предварительной компиляции ресурсов для production в рамках этапа сборки, которому в остальных случаях не требуется доступ к секретам production.

Пример Dockerfile: RUN SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile.

server (&blk) Показать исходный код
# File railties/lib/rails/application.rb, line 385
def server(&blk)
  self.class.server(&blk)
end

Передаёт вызов любого сервера, запущенного в экземпляре нового приложения, методу server, определённому в Rails::Railtie.

Защищённые методы экземпляра

ensure_generator_templates_added () Показать исходный код
# 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

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API