класс Rails::Railtie
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
Публичные методы класса
# File railties/lib/rails/railtie.rb, line 155 def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
# File railties/lib/rails/railtie.rb, line 173 def configure(&block) instance.configure(&block) end
Позволяет настроить railtie. Это тот же метод, что и в Railtie::Configurable, но этот модуль больше не требуется для всех подклассов Railtie, поэтому мы предоставляем метод класса здесь.
# File railties/lib/rails/railtie.rb, line 143 def console(&blk) register_block_for(:load_console, &blk) end
# File railties/lib/rails/railtie.rb, line 151 def generators(&blk) register_block_for(:generators, &blk) end
# File railties/lib/rails/railtie.rb, line 133
def inherited(base)
unless base.abstract_railtie?
subclasses << base
end
end # File railties/lib/rails/railtie.rb, line 166 def instance @instance ||= new end
Поскольку Rails::Railtie нельзя создать, любые методы, которые вызывают instance, предназначены для вызова только на подклассах Railtie.
# 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
# File railties/lib/rails/railtie.rb, line 139 def rake_tasks(&blk) register_block_for(:rake_tasks, &blk) end
# File railties/lib/rails/railtie.rb, line 147 def runner(&blk) register_block_for(:runner, &blk) end
# File railties/lib/rails/railtie.rb, line 129 def subclasses @subclasses ||= [] end
Публичные методы экземпляра
# 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.