класс 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
Приложение и Движок
Движок — это не более чем railtie с некоторыми предварительно заданными инициализаторами. И поскольку Rails::Application является движком, описанную здесь конфигурацию можно использовать в обоих случаях.
Убедитесь, что вы ознакомились с документацией этих конкретных классов для получения дополнительной информации.
Константы
- ABSTRACT_RAILTIES
Публичные методы класса
# File railties/lib/rails/railtie.rb, line 150 def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
# File railties/lib/rails/railtie.rb, line 172 def configure(&block) instance.configure(&block) end
Позволяет настраивать railtie. Это тот же метод, что и в Railtie::Configurable, но этот модуль больше не требуется для всех подклассов Railtie, поэтому мы предоставляем метод класса здесь.
# File railties/lib/rails/railtie.rb, line 138 def console(&blk) register_block_for(:load_console, &blk) end
# File railties/lib/rails/railtie.rb, line 146 def generators(&blk) register_block_for(:generators, &blk) end
# File railties/lib/rails/railtie.rb, line 128
def inherited(base)
unless base.abstract_railtie?
subclasses << base
end
end # File railties/lib/rails/railtie.rb, line 161 def instance @instance ||= new end
Поскольку Rails::Railtie не может быть экземпляризирован, любые методы, которые вызывают instance , предназначены для вызова только на подклассах Railtie.
# 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
# File railties/lib/rails/railtie.rb, line 134 def rake_tasks(&blk) register_block_for(:rake_tasks, &blk) end
# File railties/lib/rails/railtie.rb, line 165 def respond_to_missing?(*args) instance.respond_to?(*args) || super end
# File railties/lib/rails/railtie.rb, line 142 def runner(&blk) register_block_for(:runner, &blk) end
# File railties/lib/rails/railtie.rb, line 124 def subclasses @subclasses ||= [] end
Публичные методы экземпляра
# 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.