Двигатели можно считать миниатюрными приложениями, которые предоставляют функциональность своим хост-приложениям.Приложение Rails на самом деле представляет собой просто «перегруженный» движок, причем класс Rails :: Application наследует большую часть своего поведения от Rails :: Engine.
https://guides.rubyonrails.org/engines.html
Движок может содержатьмодели, контроллеры, маршруты, генераторы, промежуточное ПО и любой произвольный код, который вы можете смонтировать в хост-приложении.Двигатели обычно упаковываются в виде драгоценных камней.
Например, разработайте движок rails, который обеспечивает авторизацию.
В Rails есть команда генератора для создания двигателей:
rails plugin new chatty --mountable
Для этогоНапример, давайте назовем это chatty.
Поскольку движок монтируется в приложении Rails, у вас есть полный доступ к стеку Rails (например, .html_safe
).Это также означает, что вы тестируете движки, монтируя их в фиктивном приложении.
Если вы упаковали приложение как гем, то вы просто монтируете его в хост-приложении, добавляя его в Gemfile.
Чтобы настроить ваш движок, вы можете следовать «MyGem.configure pattern» :
# lib/chatty.rb
module Chatty
class << self
attr_accessor :configuration
end
def self.configure
self.configuration ||= Configuration.new
yield(configuration)
end
class Configuration
attr_accessor :foo
def initialize
@foo = 'some_value'
end
end
end
Чтобы создать файл конфигурации пользователя, вы используете генератор :
# lib/generators/chatty/install/install_generator.rb
module Chatty
class InstallGenerator < Rails::Generators::Base
source_root File.expand_path('templates', __dir__)
desc "Creates a Chatty initializer."
def copy_initializer
template 'chatty.rb', 'config/initializers/chatty.rb'
end
end
end
И шаблон кода:
# /lib/generators/chatty/install/templates/chatty.rb
Chatty.configure do |config|
config.foo = "bar"
end
Теперь вы можете запустить rails g chatty:install
, и он создаст файл в главном приложении.