2016-12-14 64 views
1

我正在使用寄存器將一個大的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個寄存器以小方法映射)。

基本上,我想有不同的寄存器與私有方法,因爲我通常寫一個單一的責任非常小的私人方法。任何想法,我怎麼能做到這一點?

回答

1

我不認爲這是可以實現的方式,你正在嘗試。如果你在不同的模塊中使用類似名稱的方法混合成一個類,那麼最後一個只會贏。

所以在這種情況下,我會創建一個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 

不,你傭工範圍限定在一個單獨的類。