Как создать Rails-специфичный Rubygem? - PullRequest
0 голосов
/ 24 октября 2018

Мы создаем службу чата, которую люди могут использовать из своего кода.

Среди инструментов, которые мы создаем, мы создали гем Ruby, чтобы люди могли быстро добавлятьОкно чата с их веб-приложением Ruby.

Мы хотели бы создать специфичную для Rails оболочку, потому что в настоящее время пользователь должен вручную вызвать .html_safe.

Как этоМожно ли использовать эти специфичные для Rails возможности изнутри Ruby?Я слышал, что это может называться «Railsties», но я не смог найти исчерпывающую документацию о них и о том, как их использовать.

В частности, мы хотели бы:

  • Вызовите html_safe на некоторых строковых выводах, чтобы пользователю не приходилось делать это вручную.
  • Поместите некоторые параметры конфигурации в файл в config/initializers/some_name.rb вместо необходимости указывать эти встроенные значения.
  • Потенциально создайте генератор, который пользователь сможет запустить для автоматического заполнения этого инициализатора.

Как мы можем использовать эти функции?Есть ли какая-то другая зависимость от драгоценных камней, которую мы можем включить в наш драгоценный камень для доступа к этим функциям?

1 Ответ

0 голосов
/ 24 октября 2018

Двигатели можно считать миниатюрными приложениями, которые предоставляют функциональность своим хост-приложениям.Приложение 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, и он создаст файл в главном приложении.

...