класс 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, в случае необходимости сопряжения его с определённым шагом в процессе инициализации.
Конфигурация
Railties могут получить доступ к объекту конфигурации, который содержит общую конфигурацию всех railties и приложения:
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 158 def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
# File railties/lib/rails/railtie.rb, line 180 def configure(&block) instance.configure(&block) end
Позволяет настроить railtie. Это тот же метод, что и в Railtie::Configurable, но этот модуль больше не требуется для всех подклассов Railtie, поэтому мы предоставляем метод класса здесь.
# File railties/lib/rails/railtie.rb, line 140 def console(&blk) @load_console ||= [] @load_console << blk if blk @load_console end
# File railties/lib/rails/railtie.rb, line 152 def generators(&blk) @generators ||= [] @generators << blk if blk @generators 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 169 def instance @instance ||= new end
Поскольку Rails::Railtie не может быть экземпляризован, любые методы, которые вызывают instance предназначены для вызова только в подклассах Railtie.
# File railties/lib/rails/railtie.rb, line 162 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) @rake_tasks ||= [] @rake_tasks << blk if blk @rake_tasks end
# File railties/lib/rails/railtie.rb, line 173 def respond_to_missing?(*args) instance.respond_to?(*args) || super end
# File railties/lib/rails/railtie.rb, line 146 def runner(&blk) @load_runner ||= [] @load_runner << blk if blk @load_runner end
# File railties/lib/rails/railtie.rb, line 124 def subclasses @subclasses ||= [] end
Защищённые методы класса
# File railties/lib/rails/railtie.rb, line 191
def method_missing(name, *args, &block)
if instance.respond_to?(name)
instance.public_send(name, *args, &block)
else
super
end
end Если метод класса отсутствует, то отправьте вызов метода экземпляру Railtie.
Публичные методы экземпляра
# File railties/lib/rails/railtie.rb, line 215 def config @config ||= Railtie::Configuration.new end
Используется для создания объекта config в Railties, экземпляра Railtie::Configuration, который используется Railties и приложением для хранения связанной конфигурации.
© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.