Spec-Zone.ru › Ruby on Rails 8.0

класс Rails::Railtie

Родитель:
Объект
Включенные модули:
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

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

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

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

Configuration

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

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

Поскольку имена файлов в пути загрузки общие для gem, убедитесь, что файлы, которые вы загружаете через 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 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 262
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