如何拆分具有不同范围的 Sinatra 应用程序?

How to split a Sinatra app with different scopes?

我正在使用寄存器将一个大的 Sinatra 文件拆分成不同的文件。这是获得 modular Sinatra app using extensions.

的一种方式

我最终得到的代码类似于以下代码:

MyApp < Sinatra::Base
  register OneRegister
  register SecondRegister
end

module OneRegister
  def self.registered(app)
    app.helpers OneRegisterHelper

    app.get "/one-endpoint" do
      do_stuff
    end
  end

  module OneRegisterHelper
    def do_stuff
      # Some code
    end
  end
end

module SecondRegister
  def self.registered(app)
    app.helpers SecondRegisterHelper

    app.get "/second-endpoint" do
      do_stuff
    end
  end

  module SecondRegisterHelper
    def do_stuff
      # Different code
    end
  end
end

问题在于 Sinatra 如何与寄存器和助手一起工作。每次我为寄存器创建一个新的助手时,我都会用助手中的方法污染主要的 Sinatra 应用程序范围。

所以,方法 do_stuff 将被 SecondRegisterHelper 覆盖(这就是 Ruby 在包含模块时的工作方式)但我想要不同的实现对于这些方法,如果我使用相同的方法名称或不同的方法名称(想象一个应用程序有 25 个寄存器,每个寄存器都有小方法)。

基本上,我希望有不同的寄存器和私有方法,因为我通常会编写非常小的私有方法来承担单一职责。有什么想法,我该如何实现?

我认为这无法通过您尝试的方式实现。如果您在不同模块中将具有相似名称的方法混合到一个 class 中,则最后一个获胜。

所以在这种情况下,我会创建一个 modular app 结合 config.ru 来设置您的应用程序。

class OneRegister < Sinatra::Base
    # helpers here
end

class SecondRegister < Sinatra::Base
    # helpers here
end

在config.ru

app = Rack::URLMap.new(
  '/one-endpoint' => OneRegister,
  '/second-endpoint' => TwoRegister 
)

run app

不,你的助手仅限于单个 class。