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

时间:2016-12-14 12:23:51

标签: ruby scope sinatra

我正在使用寄存器将大型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个寄存器,每个寄存器使用小方法)。

基本上,我希望使用私有方法使用不同的寄存器,因为我通常只编写一个非常小的私有方法。任何想法,我怎么能做到这一点?

1 个答案:

答案 0 :(得分:1)

我不认为这可以通过你的尝试来实现。如果你将不同模块中具有相似名称的方法混合到一个类中,那么最后一个只会获胜。

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

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

run app

在config.ru中

<modules>

没有帮助者的范围是一个类。