Spec-Zone.ru › Ruby on Rails 5.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)

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

Чтобы добавить шаг инициализации в процесс запуска 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

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

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

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

Константы

ABSTRACT_RAILTIES

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

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

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

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

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

railtie_name(name = nil) Показать исходный код
# File railties/lib/rails/railtie.rb, line 154
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 134
def rake_tasks(&blk)
  register_block_for(:rake_tasks, &blk)
end
respond_to_missing?(*args) Показать исходный код
# File railties/lib/rails/railtie.rb, line 165
def respond_to_missing?(*args)
  instance.respond_to?(*args) || super
end
Вызывает метод суперкласса
runner(&blk) Показать исходный код
# File railties/lib/rails/railtie.rb, line 142
def runner(&blk)
  register_block_for(:runner, &blk)
end
subclasses() Показать исходный код
# File railties/lib/rails/railtie.rb, line 124
def subclasses
  @subclasses ||= []
end

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

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