класс 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 MyGem::Railtie < Rails::Railtie
initializer "my_gem.configure_rails_initialization" do
# some initialization behavior
end
end
Если указать блок, ему также можно передать объект приложения, если вам потребуется обратиться к какой-либо конфигурации приложения, например к промежуточному ПО:
class MyGem::Railtie < Rails::Railtie
initializer "my_gem.configure_rails_initialization" do |app|
app.middleware.use MyGem::Middleware
end
end
Наконец, в качестве параметров initializer также можно передать :before и :after, если вы хотите связать инициализатор с определённым этапом процесса инициализации.
Configuration
Railtie могут обращаться к объекту config, содержащему конфигурацию, общую для всех railtie и приложения:
class MyGem::Railtie < Rails::Railtie
# Customize the ORM
config.app_generators.orm :my_gem_orm
# Add a to_prepare block which is executed once in production
# and before each request in development.
config.to_prepare do
MyGem.setup!
end
end
Загрузка задач Rake и Generators
Если в вашем railtie есть задачи Rake, вы можете указать Rails загружать их с помощью метода rake_tasks:
class MyGem::Railtie < Rails::Railtie
rake_tasks do
load "path/to/my_gem.tasks"
end
end
По умолчанию Rails загружает генераторы из пути загрузки. Однако, если вы хотите разместить генераторы в другом месте, можно указать в railtie блок, который будет загружать их при обычном поиске генераторов:
class MyGem::Railtie < Rails::Railtie
generators do
require "path/to/my_gem_generator"
end
end
Поскольку имена файлов в пути загрузки используются совместно несколькими гемами, убедитесь, что файлы, загружаемые через railtie, имеют уникальные имена.
Запуск другой программы при запуске сервера Rails
В режиме разработки часто бывает необходимо запустить ещё один процесс вместе с Rails Server. Например, может понадобиться запустить сервер Webpack или React. Или, возможно, нужно запустить процесс планировщика заданий, например Sidekiq. Обычно для этого открывают новую оболочку и запускают в ней программу.
Rails позволяет указать блок server, который будет вызван при запуске сервера Rails. Благодаря этому пользователям не нужно помнить о необходимости открывать новую оболочку и запускать другую программу, что упрощает работу для всех. Это можно сделать следующим образом:
class MyGem::Railtie < Rails::Railtie
server do
WebpackServer.start
end
end
Application и Engine
Движок — это не что иное, как railtie с уже заданными инициализаторами. А поскольку Rails::Application является движком, описанную здесь конфигурацию можно использовать и для него.
Дополнительную информацию см. в документации этих конкретных классов.
Константы
- ABSTRACT_RAILTIES
Атрибуты
Открытые методы класса
# File railties/lib/rails/railtie.rb, line 171 def abstract_railtie? ABSTRACT_RAILTIES.include?(name) end
# File railties/lib/rails/railtie.rb, line 189 def configure(&block) instance.configure(&block) end
Позволяет настроить railtie. Это тот же метод, который используется в Railtie::Configurable, но этот модуль больше не требуется всем подклассам Railtie, поэтому мы предоставляем здесь метод класса.
# File railties/lib/rails/railtie.rb, line 155 def console(&blk) register_block_for(:load_console, &blk) end
# File railties/lib/rails/railtie.rb, line 163 def generators(&blk) register_block_for(:generators, &blk) end
# File railties/lib/rails/railtie.rb, line 197 def inherited(subclass) subclass.increment_load_index super end
# File railties/lib/rails/railtie.rb, line 182 def instance @instance ||= new end
Поскольку Rails::Railtie нельзя инстанцировать, любые методы, вызывающие instance, предназначены для вызова только на подклассах Railtie.
# File railties/lib/rails/railtie.rb, line 175 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 151 def rake_tasks(&blk) register_block_for(:rake_tasks, &blk) end
# File railties/lib/rails/railtie.rb, line 159 def runner(&blk) register_block_for(:runner, &blk) end
# File railties/lib/rails/railtie.rb, line 167 def server(&blk) register_block_for(:server, &blk) end
# File railties/lib/rails/railtie.rb, line 147 def subclasses super.reject(&:abstract_railtie?).sort end
Защищённые методы класса
# File railties/lib/rails/railtie.rb, line 205 def increment_load_index @@load_counter ||= 0 @load_index = (@@load_counter += 1) end
Открытые методы экземпляра
# File railties/lib/rails/railtie.rb, line 261 def config @config ||= Railtie::Configuration.new end
Используется для создания объекта config в Railties — экземпляра Railtie::Configuration, который применяется Railties и Application для хранения связанной конфигурации.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.