Spec-Zone.ru › Ruby on Rails 8.1

класс Rails::Railtie

Родительский класс:
Object
Подключённые модули:
Rails::Initializable

Rails::Railtie — ядро фреймворка Rails, предоставляющее несколько хуков для расширения Rails и/или изменения процесса инициализации.

Каждый основной компонент Rails (Action Mailer, Action Controller, Active Record и т. д.) реализует railtie. Каждый из них отвечает за собственную инициализацию. Благодаря этому в самом Rails нет хуков компонентов, что позволяет использовать другие компоненты вместо любых стандартных компонентов Rails.

Для разработки расширения Rails не требуется реализовывать railtie, но если вам необходимо взаимодействовать с фреймворком Rails во время загрузки или после неё, railtie необходим.

Например, расширению, которое выполняет любое из следующих действий, понадобится railtie:

  • создаёт инициализаторы

  • настраивает фреймворк Rails для приложения, например задаёт генератор

  • добавляет ключи config.* в окружение

  • настраивает подписчика с помощью ActiveSupport::Notifications

  • добавляет задачи Rake

Создание Railtie

Чтобы расширить Rails с помощью railtie, создайте подкласс Rails::Railtie. Этот класс должен загружаться в процессе загрузки Rails и по соглашению называться MyNamespace::Railtie.

В следующем примере показано расширение, которое можно использовать как с Rails, так и без него.

# lib/my_gem/railtie.rb
module MyGem
  class Railtie < Rails::Railtie
  end
end

# lib/my_gem.rb
require "my_gem/railtie" if defined?(Rails::Railtie)

Инициализаторы

Чтобы добавить этап инициализации в процесс загрузки Rails из вашего railtie, просто определите код инициализации с помощью макроса initializer:

class MyGem::Railtie < Rails::Railtie
  initializer "my_gem.configure_rails_initialization" do
    # some initialization behavior
  end
end

Если указать блок, ему также можно передать объект приложения, если вам потребуется обратиться к какой-либо конфигурации приложения, например к промежуточному ПО:

class MyGem::Railtie < Rails::Railtie
  initializer "my_gem.configure_rails_initialization" do |app|
    app.middleware.use MyGem::Middleware
  end
end

Наконец, в качестве параметров initializer также можно передать :before и :after, если вы хотите связать инициализатор с определённым этапом процесса инициализации.

Configuration

Railtie могут обращаться к объекту config, содержащему конфигурацию, общую для всех railtie и приложения:

class MyGem::Railtie < Rails::Railtie
  # Customize the ORM
  config.app_generators.orm :my_gem_orm

  # Add a to_prepare block which is executed once in production
  # and before each request in development.
  config.to_prepare do
    MyGem.setup!
  end
end

Загрузка задач Rake и Generators

Если в вашем railtie есть задачи Rake, вы можете указать Rails загружать их с помощью метода rake_tasks:

class MyGem::Railtie < Rails::Railtie
  rake_tasks do
    load "path/to/my_gem.tasks"
  end
end

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

class MyGem::Railtie < Rails::Railtie
  generators do
    require "path/to/my_gem_generator"
  end
end

Поскольку имена файлов в пути загрузки используются совместно несколькими гемами, убедитесь, что файлы, загружаемые через railtie, имеют уникальные имена.

Запуск другой программы при запуске сервера Rails

В режиме разработки часто бывает необходимо запустить ещё один процесс вместе с Rails Server. Например, может понадобиться запустить сервер Webpack или React. Или, возможно, нужно запустить процесс планировщика заданий, например Sidekiq. Обычно для этого открывают новую оболочку и запускают в ней программу.

Rails позволяет указать блок server, который будет вызван при запуске сервера Rails. Благодаря этому пользователям не нужно помнить о необходимости открывать новую оболочку и запускать другую программу, что упрощает работу для всех. Это можно сделать следующим образом:

class MyGem::Railtie < Rails::Railtie
  server do
    WebpackServer.start
  end
end

Application и Engine

Движок — это не что иное, как railtie с уже заданными инициализаторами. А поскольку Rails::Application является движком, описанную здесь конфигурацию можно использовать и для него.

Дополнительную информацию см. в документации этих конкретных классов.

Константы

ABSTRACT_RAILTIES

Атрибуты

load_index [R]

Открытые методы класса

abstract_railtie? () Показать исходный код
# File railties/lib/rails/railtie.rb, line 171
def abstract_railtie?
  ABSTRACT_RAILTIES.include?(name)
end
configure (&block) Показать исходный код
# File railties/lib/rails/railtie.rb, line 189
def configure(&block)
  instance.configure(&block)
end

Позволяет настроить railtie. Это тот же метод, который используется в Railtie::Configurable, но этот модуль больше не требуется всем подклассам Railtie, поэтому мы предоставляем здесь метод класса.

console (&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 155
def console(&blk)
  register_block_for(:load_console, &blk)
end
generators (&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 163
def generators(&blk)
  register_block_for(:generators, &blk)
end
inherited (subclass) Показать исходный код
# File railties/lib/rails/railtie.rb, line 197
def inherited(subclass)
  subclass.increment_load_index
  super
end
Вызывает метод суперкласса
instance () Показать исходный код
# File railties/lib/rails/railtie.rb, line 182
def instance
  @instance ||= new
end

Поскольку Rails::Railtie нельзя инстанцировать, любые методы, вызывающие instance, предназначены для вызова только на подклассах Railtie.

railtie_name (name = nil) Показать исходный код
# File railties/lib/rails/railtie.rb, line 175
def railtie_name(name = nil)
  @railtie_name = name.to_s if name
  @railtie_name ||= generate_railtie_name(self.name)
end
rake_tasks (&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 151
def rake_tasks(&blk)
  register_block_for(:rake_tasks, &blk)
end
runner (&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 159
def runner(&blk)
  register_block_for(:runner, &blk)
end
server (&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 167
def server(&blk)
  register_block_for(:server, &blk)
end
subclasses () Показать исходный код
# File railties/lib/rails/railtie.rb, line 147
def subclasses
  super.reject(&:abstract_railtie?).sort
end
Вызывает метод суперкласса

Защищённые методы класса

increment_load_index () Показать исходный код
# File railties/lib/rails/railtie.rb, line 205
def increment_load_index
  @@load_counter ||= 0
  @load_index = (@@load_counter += 1)
end

Открытые методы экземпляра

config () Показать исходный код
# File railties/lib/rails/railtie.rb, line 261
def config
  @config ||= Railtie::Configuration.new
end

Используется для создания объекта config в Railties — экземпляра Railtie::Configuration, который применяется Railties и Application для хранения связанной конфигурации.

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

Spec-Zone.ru

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