Spec-Zone.ru › Ruby on Rails 7.0

класс 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 MyRailtie < Rails::Railtie
  initializer "my_railtie.configure_rails_initialization" do
    # some initialization behavior
  end
end

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

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

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

Configuration

Railties могут получить доступ к объекту конфигурации, который содержит общую конфигурацию для всех railties и приложения:

class MyRailtie < Rails::Railtie
  # Customize the ORM
  config.app_generators.orm :my_railtie_orm

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

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

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

class MyRailtie < Rails::Railtie
  rake_tasks do
    load "path/to/my_railtie.tasks"
  end
end

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

class MyRailtie < Rails::Railtie
  generators do
    require "path/to/my_railtie_generator"
  end
end

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

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

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

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

class MyRailtie < 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 172
def abstract_railtie?
  ABSTRACT_RAILTIES.include?(name)
end
configure(&block) Показать исходный код
# File railties/lib/rails/railtie.rb, line 190
def configure(&block)
  instance.configure(&block)
end

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

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

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

railtie_name(name = nil) Показать исходный код
# File railties/lib/rails/railtie.rb, line 176
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 152
def rake_tasks(&blk)
  register_block_for(:rake_tasks, &blk)
end
runner(&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 160
def runner(&blk)
  register_block_for(:runner, &blk)
end
server(&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 168
def server(&blk)
  register_block_for(:server, &blk)
end
subclasses() Показать исходный код
# File railties/lib/rails/railtie.rb, line 148
def subclasses
  super.reject(&:abstract_railtie?).sort
end
Вызывает метод суперкласса

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

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

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

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