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