Spec-Zone.ru › Ruby on Rails 4.1

класс Rails::Application

Родитель:
Engine

В Rails 3.0 был представлен объект Rails::Application, который представляет собой Engine, но с дополнительной задачей по координации всего процесса запуска.

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

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

Настройка

Помимо предоставления той же настройки, что и 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 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

Несколько приложений

Если вы решите определить несколько приложений, то первое инициализированное приложение будет установлено в Rails.application, если вы не переопределите его другим приложением.

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

class Application < Rails::Application
end

first_application  = Application.new
second_application = Application.new(config: first_application.config)

В приведенном выше примере для инициализации второго приложения использовались настройки из первого приложения. Вы также можете использовать initialize_copy для одного из приложений, чтобы создать копию приложения, которая разделяет настройки.

Если вы решите определить задачи rake, исполняемые файлы или инициализаторы в приложении, отличном от Rails.application, то вы должны запустить их вручную.

Атрибуты

assets[RW]
reloaders[R]
sandbox[RW]
sandbox?[RW]

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

inherited(base) Показать исходный код
Вызывает метод суперкласса
# File railties/lib/rails/application.rb, line 88
def inherited(base)
  super
  base.instance
end
new(initial_variable_values = {}, &block) Показать исходный код
Вызывает метод суперкласса
# File railties/lib/rails/application.rb, line 110
def initialize(initial_variable_values = {}, &block)
  super()
  @initialized       = false
  @reloaders         = []
  @routes_reloader   = nil
  @app_env_config    = nil
  @ordered_railties  = nil
  @railties          = nil
  @message_verifiers = {}

  Rails.application ||= self

  add_lib_to_load_path!
  ActiveSupport.run_load_hooks(:before_configuration, self)

  initial_variable_values.each do |variable_name, value|
    if INITIAL_VARIABLES.include?(variable_name)
      instance_variable_set("@#{variable_name}", value)
    end
  end

  instance_eval(&block) if block_given?
end

Публичные методы экземпляра

call(env) Показать исходный код

Реализует вызов в соответствии с API Rack. Он просто перенаправляет запрос в базовый стек средств промежуточного слоя.

Вызывает метод суперкласса
# File railties/lib/rails/application.rb, line 141
def call(env)
  env["ORIGINAL_FULLPATH"] = build_original_fullpath(env)
  env["ORIGINAL_SCRIPT_NAME"] = env["SCRIPT_NAME"]
  super(env)
end
console(&blk) Показать исходный код

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

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

Хранит некоторые параметры начальной среды Rails, которые будут использоваться средствами промежуточного слоя и engine для их настройки.

Вызывает метод суперкласса
# File railties/lib/rails/application.rb, line 193
def env_config
  @app_env_config ||= begin
    validate_secret_key_config!

    super.merge({
      "action_dispatch.parameter_filter" => config.filter_parameters,
      "action_dispatch.redirect_filter" => config.filter_redirect,
      "action_dispatch.secret_token" => secrets.secret_token,
      "action_dispatch.secret_key_base" => secrets.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,
      "action_dispatch.cookies_serializer" => config.action_dispatch.cookies_serializer
    })
  end
end
generators(&blk) Показать исходный код

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

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

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

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

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

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

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

# File railties/lib/rails/application.rb, line 248
def isolate_namespace(mod)
  self.class.isolate_namespace(mod)
end
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 ||= begin
    if secrets.secret_key_base
      key_generator = ActiveSupport::KeyGenerator.new(secrets.secret_key_base, iterations: 1000)
      ActiveSupport::CachingKeyGenerator.new(key_generator)
    else
      ActiveSupport::LegacyKeyGenerator.new(secrets.secret_token)
    end
  end
end
message_verifier(verifier_name) Показать исходный код

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

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

Рекомендуется не использовать один и тот же верификатор для разных задач, поэтому можно получить разные верификаторы, передав параметр 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 для получения дополнительной информации.

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

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

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

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

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

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

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

Возвращает секреты, добавленные в config/secrets.yml.

Пример:

development:
  secret_key_base: 836fa3665997a860728bcb9e9a1e704d427cfc920e79d847d79c8a9a907b9e965defa4154b2b86bdec6930adbe33f21364523a6f6ce363865724549fdfc08553
test:
  secret_key_base: 5a37811464e7d378488b0f073e2193b093682e4e21f5d6f3ae0a4e1781e61a351fdc878a843424e81c73fb484a40d23f92c8dafac4870e74ede6e5e174423010
production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
  namespace: my_app_production

Rails.application.secrets.namespace возвращает my_app_production в среде производства.

# File railties/lib/rails/application.rb, line 333
def secrets
  @secrets ||= begin
    secrets = ActiveSupport::OrderedOptions.new
    yaml = config.paths["config/secrets"].first
    if File.exist?(yaml)
      require "erb"
      all_secrets = YAML.load(ERB.new(IO.read(yaml)).result) || {}
      env_secrets = all_secrets[Rails.env]
      secrets.merge!(env_secrets.symbolize_keys) if env_secrets
    end

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

    secrets
  end
end

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

Spec-Zone.ru

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