Spec-Zone.ru › Ruby on Rails 7.0

класс Rails::Application

Родитель:
Engine

Объект Engine с ответственностью за координацию всего процесса загрузки.

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

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

Configuration

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

Чтобы увидеть их все, обратитесь к Rails::Application::Configuration.

Маршруты

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

Средства-посредники

Объект Application также отвечает за построение стека средств-посредников.

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

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

1)  require "config/boot.rb" to set up 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

Атрибуты

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

Публичные методы класса

create(initial_variable_values = {}, &block) Показать исходный код
# File railties/lib/rails/application.rb, line 81
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 85
def find_root(from)
  find_root_with_flag "config.ru", from, Dir.pwd
end
inherited(base) Показать исходный код
# File railties/lib/rails/application.rb, line 70
def inherited(base)
  super
  Rails.app_class = base
  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 77
def instance
  super.run_load_hooks!
end
Вызывает метод суперкласса
new(initial_variable_values = {}, &block) Показать исходный код
# File railties/lib/rails/application.rb, line 106
def initialize(initial_variable_values = {}, &block)
  super()
  @initialized       = false
  @reloaders         = []
  @routes_reloader   = nil
  @app_env_config    = nil
  @ordered_railties  = nil
  @railties          = nil
  @message_verifiers = {}
  @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 221
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

# You can also store configurations in a shared section which will be
# merged with the environment configuration

# 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 303
def console(&blk)
  self.class.console(&blk)
end

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

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

Расшифровывает хеш данных аутентификации, хранящихся в config/credentials.yml.enc. Этот файл зашифрован с помощью основного ключа Rails, который берется либо из ENV["RAILS_MASTER_KEY"], либо из файла config/master.key. Если существует отдельный файл аутентификации для текущей среды, он имеет приоритет. Таким образом, для среды production сначала ищется config/credentials/production.yml.enc с основным ключом, взятым из ENV["RAILS_MASTER_KEY"] или из файла config/credentials/production.key. Поведение по умолчанию может быть переопределено установкой config.credentials.content_path и config.credentials.key_path.

eager_load!() Показать исходный код
# File railties/lib/rails/application.rb, line 496
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 462
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

Упрощенный способ расшифровки зашифрованных конфигураций или файлов.

Для любого файла, добавленного с помощью вызова rails encrypted:edit, вызовите read, чтобы расшифровать файл с использованием основного ключа. Основной ключ хранится в config/master.key или ENV["RAILS_MASTER_KEY"].

Rails.application.encrypted("config/mystery_man.txt.enc").read
# => "We've met before, haven't we?"

Также возможно интерпретировать зашифрованные файлы YAML с помощью config.

Rails.application.encrypted("config/credentials.yml.enc").config
# => { next_guys_line: "I don't think so. Where was it you think we met?" }

Любые конфигурации верхнего уровня также доступны напрямую в возвращаемом значении:

Rails.application.encrypted("config/credentials.yml.enc").next_guys_line
# => "I don't think so. Where was it you think we met?"

Файлы или конфигурации также могут быть зашифрованы с помощью пользовательского ключа. Для расшифровки с помощью ключа в ENV, используйте:

Rails.application.encrypted("config/special_tokens.yml.enc", env_key: "SPECIAL_TOKENS")

Или для расшифровки с помощью файла, который следует игнорировать в системе контроля версий, относительно Rails.root:

Rails.application.encrypted("config/special_tokens.yml.enc", key_path: "config/special_tokens.key")
env_config() Показать исходный код
# File railties/lib/rails/application.rb, line 250
def env_config
  @app_env_config ||= super.merge(
      "action_dispatch.parameter_filter" => config.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.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 309
def generators(&blk)
  self.class.generators(&blk)
end

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

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

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

initializer(name, opts = {}, &block) Показать исходный код
# File railties/lib/rails/application.rb, line 291
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 320
def isolate_namespace(mod)
  self.class.isolate_namespace(mod)
end

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

key_generator() Показать исходный код
# File railties/lib/rails/application.rb, line 153
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 ||= ActiveSupport::CachingKeyGenerator.new(
    ActiveSupport::KeyGenerator.new(secret_key_base, iterations: 1000)
  )
end

Возвращает генератор ключей приложения.

message_verifier(verifier_name) Показать исходный код
# File railties/lib/rails/application.rb, line 179
def message_verifier(verifier_name)
  @message_verifiers[verifier_name] ||= begin
    secret = key_generator.generate_key(verifier_name.to_s)
    ActiveSupport::MessageVerifier.new(secret)
  end
end

Возвращает объект верификатора сообщений.

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

Рекомендуется не использовать один и тот же верификатор для разных задач, поэтому вы можете получить разные верификаторы, передавая аргумент verifier_name.

Параметры

  • verifier_name - имя верификатора сообщений.

Примеры

message = Rails.application.message_verifier('sensitive_data').generate('my sensible data')
Rails.application.message_verifier('sensitive_data').verify(message)
# => 'my sensible data'

См. документацию по ActiveSupport::MessageVerifier для получения дополнительной информации.

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

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

reload_routes!() Показать исходный код
# File railties/lib/rails/application.rb, line 148
def reload_routes!
  routes_reloader.reload!
end

Перезагружает маршруты приложения независимо от того, изменились ли они.

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

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

secret_key_base() Показать исходный код
# File railties/lib/rails/application.rb, line 414
def secret_key_base
  if Rails.env.development? || Rails.env.test?
    secrets.secret_key_base ||= generate_development_secret
  else
    validate_secret_key_base(
      ENV["SECRET_KEY_BASE"] || credentials.secret_key_base || secrets.secret_key_base
    )
  end
end

Ключ secret_key_base используется в качестве секретного ввода для генератора ключей приложения, который в свою очередь используется для создания всех MessageVerifiers/MessageEncryptors, включая те, которые подписывают и шифруют куки.

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

Во всех остальных средах мы сначала ищем его в переменных окружения, затем в credentials.secret_key_base и, наконец, в secrets.secret_key_base. Для большинства приложений правильное место для его хранения — в зашифрованном файле аутентификации.

secrets() Показать исходный код
# File railties/lib/rails/application.rb, line 389
def secrets
  @secrets ||= begin
    secrets = ActiveSupport::OrderedOptions.new
    files = config.paths["config/secrets"].existent
    files = files.reject { |path| path.end_with?(".enc") } unless config.read_encrypted_secrets
    secrets.merge! Rails::Secrets.parse(files, env: Rails.env)

    # Fallback to config.secret_key_base if secrets.secret_key_base isn't set
    secrets.secret_key_base ||= config.secret_key_base

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

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

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

validate_secret_key_base(secret_key_base) Показать исходный код
# File railties/lib/rails/application.rb, line 574
def validate_secret_key_base(secret_key_base)
  if secret_key_base.is_a?(String) && secret_key_base.present?
    secret_key_base
  elsif secret_key_base
    raise ArgumentError, "`secret_key_base` for #{Rails.env} environment must be a type of String`"
  else
    raise ArgumentError, "Missing `secret_key_base` for '#{Rails.env}' environment, set this string with `bin/rails credentials:edit`"
  end
end

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

Spec-Zone.ru

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