如何创建一个针对Rails的Ruby gem?

3
我们正在构建一个聊天服务,人们可以在其代码中使用。
在我们正在构建的工具中,我们制作了一个Ruby gem,使人们能够快速将聊天窗口添加到他们的Ruby Web应用程序中。
但是,我们想创建一个特定于Rails的包装器,因为目前用户必须手动调用“.html_safe”。
如何在Ruby gem内部使用这些特定于Rails的功能?我听说这可能被称为“Railsties”,但我没有找到任何全面的文档,也不知道如何使用它们。
具体来说,我们想要:
- 在某些字符串输出上调用“html_safe”,以便用户无需手动操作。 - 将一些配置设置放在“config/initializers/some_name.rb”文件中,而不是内联指定这些设置。 - 可能会创建一个生成器,用户可以运行它自动填充此初始化器。
我们该如何使用这些功能?是否有其他gem依赖项可以包含在我们的gem中以访问这些功能?

也许可以看一下 https://edgeapi.rubyonrails.org/classes/Rails/Railtie.html - lacostenycoder
Railties 实际上与您想要的完全不同。 Railties 是组成 Rails 框架堆栈的低级组件。例如,ActiveRecord 和 Mongoid 都是 railties。您可以在 /config/application.rb 中看到 railties 的列表。 - max
由于您所描述的功能(聊天服务器)是应用程序的一部分,而不是框架本身,因此它不是一个railtie。 - max
1个回答

1
引擎可以被视为向其主机应用程序提供功能的微型应用程序。Rails 应用程序实际上只是一个“超级”引擎,其中 Rails::Application 类从 Rails::Engine 继承了大部分行为。
https://guides.rubyonrails.org/engines.html 引擎可以包含模型、控制器、路由、生成器、中间件和任何你可以挂载到主机应用程序中的任意代码。引擎通常被打包成宝石。
例如,Devise 是一个提供授权的 Rails 引擎。
Rails 有一个生成器命令用于创建引擎:
rails plugin new chatty --mountable

对于这个例子,我们称其为chatty。

由于引擎已经安装在Rails应用程序中,因此您可以完全访问Rails堆栈(例如.html_safe)。这也意味着您可以通过将它们挂载到虚拟应用程序中来测试引擎。

如果您将应用程序打包为gem,则只需将其添加到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,它会在主应用程序中创建文件。

请确保您也阅读了Rails::Engine的API文档 - max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接