【问题标题】:Automatically add rack middleware with a gem使用 gem 自动添加机架中间件
【发布时间】:2023-10-24 07:13:01
【问题描述】:

我有一个提供一些机架中间件的 gem,我可以让它工作的唯一方法是将它放在我的 application.rb 中

config.middleware.use "TBBC::Editor::Middleware"

当我的 gem 用于应用程序 Gemfile 时,我怎样才能使这个中间件自动使用?

【问题讨论】:

    标签: ruby rubygems rack


    【解决方案1】:

    如果您希望您的 gem 与 Rails 3 一起使用,您可以提供Railtie。然后,您可以在使用 Rails 时自动加载它。

    假设您的 gem 的名称是 tbbc,请将其放在 lib/tbbc/railtie.rb

    module TBBC
      class Railtie < Rails::Railtie
        initializer "tbbc.insert_middleware" do |app|
          app.config.middleware.use "TBBC::Editor::Middleware"
        end
      end
    end
    

    lib/tbbc.rb:

    require "tbbc/railtie" if defined? Rails
    

    您不能自动将中间件添加到通用 Rack 应用程序中。对于非 Rails 应用程序,这将是用户必须做的事情。

    【讨论】:

    • 我似乎无法让它工作,我在初始化程序块中添加了一个 puts 行,但它看起来并没有被执行过
    • 文件是否正在加载?该类是Rails::Railtie的子类吗?
    • 文件正在加载,只是块没有被执行。我怎么知道它是否是一个子类?
    • 通过 Railtie 添加中间件甚至是经典的 Railtie 示例,请参阅 Railtie 官方文档:api.rubyonrails.org/classes/Rails/Railtie.html