класс 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 198 def inherited(subclass) subclass.increment_load_index super 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?).sort end
Защищённые методы класса
# File railties/lib/rails/railtie.rb, line 206 def increment_load_index @@load_counter ||= 0 @load_index = (@@load_counter += 1) end
Общедоступные методы экземпляра
# File railties/lib/rails/railtie.rb, line 262 def config @config ||= Railtie::Configuration.new end
Используется для создания объекта config в Railties, экземпляра Railtie::Configuration, который используется Railties и Application для хранения связанной конфигурации.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.