Railties
Rails::Railtie
это основа Rails фреймворка, а также некоторые хуки для расширения Rails и/или модификации процесса инициализации.
Каждый важный компонент Rails (Action Mailer, Action Record, Action Controller и др.) реализуют Railtie (являются под-классами). Каждый отвечает за свою собственную инициализацию. Это позволяет Rails не иметь каких-либо собственных хуков для компонентов, позволяя использовать другие компоненты для
При разработке расширения Rails не требуется реализовывать railite
, но если нужно взаимодействовать с Rails фреймворком перед или после загрузки, railtie
потребуется.
Для примера, расширения выполняющие слеудующее, требуют railtie
:
- создание инициализатора
- конфигурирование Rails фреймворка для приложения, например настройка генератора
- добавление ключей `config.*` в окружение
- установка подписчика с
ActiveSupport::Notifications
- добавление Rake задач
Создание Railtie
Для расширения Rails с использованием railtie, создайте под-класс Rails::Railtie
. Это класс должен быть подключен в процессе загрузки приложения и по соглашению должен называться 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
# какое-то поведение при инициализации
end
end
Если используется блок, то также можно передать объект приложения, например можно получить доступ к каким-то специфическим переменным конфигурации:
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
config.app_generators.orm :my_railtie_orm
# Добаление блока to_prepare, который выполняется один раз в production
# и перед каждым запросм в development
config.to_prepare do
MyRailtie.setup!
end
end
Загрузка Rake-задач и Генераторов
Если ваш railtie содержит Rake задачи, то можно загружать их посредством метода rake_tasks
:
class MyRailtie < Rails::Railtie
rake_tasks do
load 'path/to/my_railtie.tasks'
end
end