如何使用不同范围分割Sinatra应用程序?

问题描述:

我正在使用寄存器将一个大的Sinatra文件分成不同的文件。这是获得modular Sinatra app using extensions的一种方法。如何使用不同范围分割Sinatra应用程序?

我结束了类似下面的代码:

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应用程序范围。

因此,方法do_stuff将被覆盖SecondRegisterHelper(这是如何包括一个模块的Ruby的工作原理),但我想有不同的实现方法,而不用担心,如果我使用相同的方法名称或不同的名称(每个应用程序使用25个寄存器以小方法映射)。

基本上,我想有不同的寄存器与私有方法,因为我通常写一个单一的责任非常小的私人方法。任何想法,我怎么能做到这一点?

我不认为这是可以实现的方式,你正在尝试。如果你在不同的模块中使用类似名称的方法混合成一个类,那么最后一个只会赢。

所以在这种情况下,我会创建一个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 

不,你佣工范围限定在一个单独的类。