Spec-Zone.ru › Ruby on Rails 5.2

класс 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)

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

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

Конфигурация

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

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 и генераторов

Если ваш 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, имеют уникальные имена.

Приложение и Движок

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

Убедитесь, что вы ознакомились с документацией этих конкретных классов для получения дополнительной информации.

Константы

ABSTRACT_RAILTIES

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

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

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

console(&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 143
def console(&blk)
  register_block_for(:load_console, &blk)
end
generators(&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 151
def generators(&blk)
  register_block_for(:generators, &blk)
end
inherited(base) Показать исходный код
# File railties/lib/rails/railtie.rb, line 133
def inherited(base)
  unless base.abstract_railtie?
    subclasses << base
  end
end
instance() Показать исходный код
# File railties/lib/rails/railtie.rb, line 166
def instance
  @instance ||= new
end

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

railtie_name(name = nil) Показать исходный код
# File railties/lib/rails/railtie.rb, line 159
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 139
def rake_tasks(&blk)
  register_block_for(:rake_tasks, &blk)
end
runner(&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 147
def runner(&blk)
  register_block_for(:runner, &blk)
end
subclasses() Показать исходный код
# File railties/lib/rails/railtie.rb, line 129
def subclasses
  @subclasses ||= []
end

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

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

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

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

Spec-Zone.ru

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