2016-12-14 10 views
1

大きなSinatraファイルをレジスタを使って別のファイルに分割します。これはmodular Sinatra app using extensionsを持つ1つの方法です。異なるスコープの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_stuffSecondRegisterHelperで上書きされますが(これはモジュールを組み込むときにRubyが動作する方法です)、同じメソッドを使用していても別の実装をしたいと思います名前または別のもの(それぞれ25個のレジスタを持ち、それぞれに小さなメソッドを持つappをイメージします)。

基本的に私は通常、非常に小さなプライベートメソッドを1つの責任で書くので、プライベートメソッドとは異なるレジスタを持っていたいと思います。任意のアイデア、どのようにこれを達成することができますか?

答えて

1

私はこれがあなたが試みている方法では達成できないと思います。別のモジュールに似たような名前のメソッドを1つのクラスに混ぜると、最後のものだけが勝ちます。

この場合、modular appとconfig.ruを組み合わせてアプリケーションをセットアップします。 config.ru

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

run app 

class OneRegister < Sinatra::Base 
    # helpers here 
end 

class SecondRegister < Sinatra::Base 
    # helpers here 
end 

なしあなたヘルパーは単一のクラスにスコープされていません。

関連する問題