класс 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::Railtie)
Инициализаторы
Чтобы добавить шаг инициализации в процесс загрузки 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, в случае необходимости связать его со специфическим шагом процесса инициализации.
Configuration
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 и Generators
Если ваш 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, имеют уникальные имена.
Запуск другой программы при запуске сервера Rails
В режиме разработки очень часто требуется запуск другого процесса рядом с сервером Rails Server. Например, вам может потребоваться запустить сервер Webpack или React. Или, возможно, вам нужно запустить процесс планировщика задач, например, Sidekiq. Это обычно делается путем открытия новой оболочки и запуска программы отсюда.
Rails позволяют указать блок server, который будет вызываться при запуске сервера Rails. Таким образом, вашим пользователям не нужно помнить о необходимости открывать новую оболочку и запускать другую программу, что делает это менее запутанным для всех. Его можно использовать так:
class MyRailtie < Rails::Railtie
server do
WebpackServer.start
end
end
Application и Engine
Двигатель — это не что иное, как railtie с уже настроенными инициализаторами. И поскольку Rails::Application является двигателем, эту же конфигурацию можно использовать в обоих случаях.
Убедитесь, что вы ознакомились с документацией этих конкретных классов для получения дополнительной информации.
Константы
- ABSTRACT_RAILTIES
Публичные методы класса
# File railties/lib/rails/railtie.rb, line 172 def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
# File railties/lib/rails/railtie.rb, line 190 def configure(&block) instance.configure(&block) end
Позволяет настроить railtie. Это тот же метод, что и в Railtie::Configurable, но этот модуль больше не требуется для всех подклассов Railtie, поэтому мы предоставляем метод класса здесь.
# File railties/lib/rails/railtie.rb, line 156 def console(&blk) register_block_for(:load_console, &blk) end
# File railties/lib/rails/railtie.rb, line 164 def generators(&blk) register_block_for(:generators, &blk) end
# File railties/lib/rails/railtie.rb, line 183 def instance @instance ||= new end
Поскольку Rails::Railtie не может быть инстанцирован, любые методы, которые вызывают instance, предназначены для вызова только на подклассах Railtie.
# File railties/lib/rails/railtie.rb, line 176 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 152 def rake_tasks(&blk) register_block_for(:rake_tasks, &blk) end
# File railties/lib/rails/railtie.rb, line 160 def runner(&blk) register_block_for(:runner, &blk) end
# File railties/lib/rails/railtie.rb, line 168 def server(&blk) register_block_for(:server, &blk) end
# File railties/lib/rails/railtie.rb, line 148 def subclasses super.reject(&:abstract_railtie?) end
Публичные методы экземпляра
# File railties/lib/rails/railtie.rb, line 240 def config @config ||= Railtie::Configuration.new end
Используется для создания объекта config в Railtie, экземпляра Railtie::Configuration, который используется Railtie и Application для хранения связанной конфигурации.
© 2004–2020 David Heinemeier Hansson
Licensed under the MIT License.